Recentemente foi adicionado ao Rails o método touch, disponível tanto no Rails 2.3 quanto no Edge (em direção ao 3.0). O touch atualiza o campo updated_at/updated_on do model e então salva o registro. Ele também permite a passagem de um parâmetro, que identifica outro campo data/hora para ser atualizado no lugar de updated_at/updated_on.  Touch quer dizer exatamente isto: tocar o registro, ou atualizar um determinado campo com a data/hora atual.

Utilizando o método:

class Project < ActiveRecord::Base
  validates_presence_of :name
end

# No console
project = Project.create(:name => 'Meu primeiro projeto')
#<Project id: 1, name: "Meu primeiro projeto",
#  created_at: "2009-04-21 05:35:22", updated_at: "2009-04-21 05:35:22">
# Atualizando o campo updated_at no momento que for necessário
project.touch
# true
project
#<Project id: 1, name: "Meu primeiro projeto",
#  created_at: "2009-04-21 05:35:22", updated_at: "2009-04-21 05:40:49">

Preste atenção ao campo updated_at e verifique que ele foi atualizado com sucesso. Podemos também passar o campo que desejamos “tocar”:

project.touch(:created_at)
# true
project
#<Project id: 1, name: "Meu primeiro projeto",
#  created_at: "2009-04-21 05:42:31", updated_at: "2009-04-21 05:42:31">

Veja que agora foi o campo created_at que foi atualizado (nesse caso o updated_at também foi atualizado por ser uma funcionalidade interna do Rails).

Agora vem o mais interessante: essa funcionalidade foi também adicionada a associação belongs_to, onde é possível passar a opção :touch => true para atualizar o campo updated_at/updated_on do model master automaticamente, ou então passar um símbolo, como :touch => :campo_a_atualizar, para “tocar” este campo específico ao invés do padrão.

Vejamos como fica:

class Project < ActiveRecord::Base
  has_many :tasks
  validates_presence_of :name
end

class Task < ActiveRecord::Base
  belongs_to :project, :touch => true
end

# No console
project = Project.first
#<Project id: 1, name: "Meu primeiro projeto",
#  created_at: "2009-04-21 05:42:31", updated_at: "2009-04-21 05:42:31">
# Checagem de sanidade
project.updated_at
# Tue, 21 Apr 2009 05:42:31 UTC +00:00
# Criando uma tarefa
project.tasks.create(:name => 'Primeira tarefa')
#<Task id: 1, name: "Primeira tarefa", project_id: 1,
#  created_at: "2009-04-21 05:49:41", updated_at: "2009-04-21 05:49:41">
project.reload.updated_at
# Tue, 21 Apr 2009 05:49:41 UTC +00:00

Novamente atenção ao campo updated_at do model Project: atualizado =).

É isso, uma mudança simples que facilita bastante o dia-a-dia.

Lembrando que para testar os método touch é necessário ter a última versão do rails 2.3 disponível no git.