覆盖ActiveRecord模型上的时间戳属性

时间:2016-03-29 01:32:37

标签: ruby-on-rails ruby activerecord

我有一个ActiveRecord模型用户,我将覆盖时间戳属性,如下所示:

class User < ActiveRecord::Base
  def updated_at
    <some calculation>
  end

  def updated_at=
    <some calculation>
  end

  def created_at
    <some calculation>
  end

  def created_at=
    <some calculation>
  end
end

当我在创建时明确传递这些属性时,一切正常。我希望能够在定期更新和创建时进行这些计算。

例如:

User.create
User.update_attributes(:not_timestamp_attributes => <some value>)

还应该使用计算更新时间戳。

这是否有最好的做法?我有谷歌搜索,我找不到任何覆盖时间戳属性。

2 个答案:

答案 0 :(得分:1)

最佳做法是让ActiveRecord为您处理更新这些值。

但是如果您仍然需要进行某种计算,可以尝试向before_savebefore_create添加一些回调以明确地执行此操作,如下所示:

class User < ActiveRecord::Base
  before_save   :compute_updated_at
  before_create :compute_created_at, :compute_updated_at

  def created_at
    read_attribute(:created_at)
  end

  def created_at=(value)
    compute_created_at
  end

  def updated_at
    read_attribute(:updated_at)
  end

  def updated_at=(value)
    compute_updated_at
  end

  private

  def compute_updated_at
    write_attribute(:updated_at, Time.now + 1.month)
  end

  def compute_created_at
    write_attribute(:created_at, Time.now + 2.month)
  end
end

答案 1 :(得分:0)

您可以使用单独的列显示计算值,使用before_save操作和ActiveRecord::Dirty&#34; column_changed?&#34;方法

before_save :calculate_created_at, if: :created_at_changed?

def calculate_created_at
  update_column(:calculated_created_at, created_at - 1.days)
end