我有一个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>)
还应该使用计算更新时间戳。
这是否有最好的做法?我有谷歌搜索,我找不到任何覆盖时间戳属性。
答案 0 :(得分:1)
最佳做法是让ActiveRecord为您处理更新这些值。
但是如果您仍然需要进行某种计算,可以尝试向before_save
和before_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