Ruby on rails 特定列的Rails时间戳

Ruby on rails 特定列的Rails时间戳,ruby-on-rails,activerecord,callback,Ruby On Rails,Activerecord,Callback,我正在寻找一种方法,为记录中的多个列在列中添加一个*\u updated\u 它的工作原理与普通Rails时间戳类似,即基于约定。如果在中有一个名为author\u updated\u的DB列,则只要author属性发生更改,该类就会自动更新它 写起来不太难,但我想我会在这里问一下,以防有人以前做过,或者周围有宝石。我还想知道这种方法是否存在任何性能问题,尽管我认为在保存之前使用应该可以忽略不计。不需要额外的读取或写入操作。您可能想尝试—它跟踪模型的更改,但方式略有不同—而不是为每个属性添加额外

我正在寻找一种方法,为记录中的多个列在列中添加一个
*\u updated\u

它的工作原理与普通Rails时间戳类似,即基于约定。如果在
中有一个名为
author\u updated\u的DB列,则只要
author
属性发生更改,该类就会自动更新它

写起来不太难,但我想我会在这里问一下,以防有人以前做过,或者周围有宝石。我还想知道这种方法是否存在任何性能问题,尽管我认为在保存之前使用
应该可以忽略不计。不需要额外的读取或写入操作。

您可能想尝试—它跟踪模型的更改,但方式略有不同—而不是为每个属性添加额外的列来跟踪—它使用一个表来存储模型的版本。这将为您提供一个完整的版本控制系统,而无需做很多工作

您可以轻松恢复到以前的版本,并跟踪谁创建了修订版等

但是,如果您只需要一个轻量级的解决方案来存储对有限属性集的更改的时间戳,那么您可以使用模型回调在
列中设置
*\u updated\u

module AttributeTimestamps

  extend ActiveSupport::Concern

  included do
    after_validation(on: :update) do
      # Use ActiveModel::Dirty to get the changed attributes
      self.previous_changes.each_with_index do |attr|
        setter = "#{attr}_updated_at="
        self.call(setter, self.updated_at) if self.respond_to? setter
      end
    end
  end
end

classmymodel
您可能想尝试一下-它跟踪模型的更改,但方式略有不同-而不是为每个属性添加额外的列来跟踪-它使用一个表来存储模型的版本。这使您可以在不做很多工作的情况下,实现一个完整的版本控制系统

您可以轻松恢复到以前的版本,并跟踪谁创建了修订版等

但是,如果您只需要一个轻量级的解决方案来存储对有限属性集的更改的时间戳,那么您可以使用模型回调在
列中设置
*\u updated\u

module AttributeTimestamps

  extend ActiveSupport::Concern

  included do
    after_validation(on: :update) do
      # Use ActiveModel::Dirty to get the changed attributes
      self.previous_changes.each_with_index do |attr|
        setter = "#{attr}_updated_at="
        self.call(setter, self.updated_at) if self.respond_to? setter
      end
    end
  end
end

classmymodel
我用不同版本的@max解决方案解决了这个问题

以前的更改对我不起作用。我使用的是Rails 4.2

module AttributeTimestampable
  extend ActiveSupport::Concern

  included do
    after_save do
      self.changed.each do |attr|
        timestamp = "#{attr}_updated_at"
        update_column(timestamp, updated_at) if self.respond_to? timestamp
      end
    end
  end
end

我用另一个版本的@max解决方案解决了这个问题

以前的更改对我不起作用。我使用的是Rails 4.2

module AttributeTimestampable
  extend ActiveSupport::Concern

  included do
    after_save do
      self.changed.each do |attr|
        timestamp = "#{attr}_updated_at"
        update_column(timestamp, updated_at) if self.respond_to? timestamp
      end
    end
  end
end

你不需要宝石,香草Rails就足够了。将此与..一起使用。。你已经完成了。你不需要宝石,香草Rails就足够了。将此与..一起使用。。你做完了,谢谢。我希望这更多的是为了性能优化,而不是审计,所以它不会解决问题。谢谢。我更多的是为了性能优化而不是审计,所以它不能解决问题。