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

Joh*_*ley 16 activerecord constructor ruby-on-rails

我刚刚阅读了这个问题,即将ActiveRecord模型的日期字段赋予默认值.接受的答案显示了如何在控制器中设置默认值.在我看来,这种业务逻辑确实属于模型本身.

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

Top*_*gio 22

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

你应该使用after_initialize而不是initialize.ActiveRecord :: Base需要initialize方法来准备许多便捷方法.如果after_initialize在模型中定义了一个方法,它将被调用为new,create,find以及生成模型实例的任何其他方法的回调.

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

def after_initialize
  @attribute ||= default_value
end
Run Code Online (Sandbox Code Playgroud)

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

after_initialize :run_some_other_method
Run Code Online (Sandbox Code Playgroud)

  • 这似乎在 Rails 4 / ActiveRecord 4.2.0 中发生了变化。请参阅[我的答案](http://stackoverflow.com/a/29566511/210780)了解更多详细信息。 (2认同)