ActiveRecord模型构造函数在Rails中有什么作用(如果有的话)?

时间:2009-11-11 17:00:27

标签: ruby-on-rails activerecord constructor

我刚刚阅读this question,这是关于为ActiveRecord模型的日期字段提供默认值。接受的答案显示了如何在控制器中设置默认值。在我看来,这种业务逻辑确实属于模型本身。

然后我开始思考如果这是Java我可能在声明实例变量时或在构造函数中设置初始字段值。由于数据库支持的字段不必在ActiveRecord模型中显式声明,这是否可以使用模型的initialize方法?我很好奇,因为在我看过的Rails代码中,我并没有真正看到ActiveRecord模型的构造函数。他们是否有角色扮演,如果是,那是什么?

3 个答案:

答案 0 :(得分:21)

我经常这样做是为了默认值。它运行良好,仍然允许用户更改它。请记住,当您说MyObject.new时,会调用initialize方法。但是,您可能希望阅读有关使用initialize的{​​{3}}(虽然有点过时)。

您应该使用after_initialize代替initialize。 ActiveRecord :: Base需要initialize方法来准备许多便捷方法。如果在模型中定义了after_initialize方法,则会将其调用为new,create,find以及生成模型实例的任何其他方法的回调。

理想情况下,你想要像这样定义它:

def after_initialize
  @attribute ||= default_value
end

另请注意,您不能像其他回调一样使用此回调,您必须定义名为after_initialize的方法(如上所述)才能使其正常工作。您无法执行以下操作:

after_initialize :run_some_other_method

答案 1 :(得分:3)

@TopherFangio的回答是正确的。似乎ActiveRecord API在他的回答(2009)和现在(2015)之间改变了一段时间。

截至今天(使用ActiveRecord 4.2.0的Rails 4),以下是添加初始化程序的方法according to the ActiveRecord docs

class Widget < ActiveRecord::Base
  after_initialize |new_widget|
    new_widget.name ||= 'Unnamed Widget'
  end
end

您可以使用puts语句进行验证,也可以检查来自rails console的新对象实际初始化是否正确。

答案 2 :(得分:2)

根据此blog,活动记录并不总是使用new,因此可能不会在您的对象上调用初始化。