我刚刚阅读this question,这是关于为ActiveRecord模型的日期字段提供默认值。接受的答案显示了如何在控制器中设置默认值。在我看来,这种业务逻辑确实属于模型本身。
然后我开始思考如果这是Java我可能在声明实例变量时或在构造函数中设置初始字段值。由于数据库支持的字段不必在ActiveRecord模型中显式声明,这是否可以使用模型的initialize
方法?我很好奇,因为在我看过的Rails代码中,我并没有真正看到ActiveRecord模型的构造函数。他们是否有角色扮演,如果是,那是什么?
答案 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,因此可能不会在您的对象上调用初始化。