mass_assign后,Activerecord初始化属性

时间:2016-05-19 06:19:16

标签: ruby-on-rails ruby activerecord

我有一个继承ActiveRecord::Base的模型,数据库中包含以下属性:

scheduler.rb

#  id               :integer          not null, primary key
#  next_datetime    :datetime
#  first_datetime   :datetime
#  created_at       :datetime         not null
#  updated_at       :datetime         not null

此模型中的对象应该像这样实例化:

scheduler.new(first_datetime: DateTime.new(2016, 1, 1))

当创建对象(不一定保存到数据库)时,我想将first_datetime中的属性复制到next_datetime,这样当我访问{时,我永远不会得到nil {1}}。

我尝试使用my_scheduler.next_datetime回调,但是在执行此代码时,质量指定的属性尚不可用。

如何初始化此属性?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我唯一能想到的是覆盖initialize ActiveRecord::Base方法,以便在模型的超类结束处理后添加这个小的自定义。

这可以通过以下方式实现:

def initialize(attributes = nil, options = {})
  super
  next_datetime ||= first_datetime
end

希望这可以帮到你!

答案 1 :(得分:0)

您是否使用过after_initialize?:

 after_initiation :set_next_datetime

 def set_next_datetime
  if new_record?
    next_datetime ||= first_datetime
  end
 end

答案 2 :(得分:0)

使用tap可能有所帮助:

scheduler.new(first_datetime: DateTime.new(2016, 1, 1)).tap do |record|
  record.next_datetime = record.first_datetime
end