【问题标题】:How to use 'after_initialize' in Rails 3?如何在 Rails 3 中使用“after_initialize”?
【发布时间】:2011-06-21 20:36:38
【问题描述】:

更新

我错误地检查了 edgerails 指南,而不是当前正确的 Rails 3 指南(其中没有提到 after_initialize)。不知道为什么 edgerails 指南是“不正确的”——我认为 edgerails 指南应该是最新的指南?

我保留这个问题,以防有人来寻找相同的“问题”。

after_initialize 的宏观调用是可行的方法。



应该将after_initialize用作方法还是宏式调用?

这可行,但会发出弃用警告:

def after_initialize
  logger.info "Called after_initialize"
end

弃用警告:Base#after_initialize 已被弃用, 请改用 Base.after_initialize :method。

这有效,并且没有警告:

after_initialize :do_this_after_initialize
def do_this_after_initialize
  logger.info "Called after_initialize"
end

但是10.4 after_initialize and after_find 中的 Active Record 验证和回调指南说:

...如果您尝试注册 after_initialize 或 after_find 使用 宏样式的类方法,它们将 只是被忽略。这种行为是 由于性能原因,由于 after_initialize 和 after_find 将 为找到的每条记录都调用两者 在数据库中,显着减慢 向下查询...

这意味着宏风格的使用相对于方法风格的方式效率低?

(我指南错了,'cos 代码为王 :D)


另一个更新

2011 年 1 月 28 日的 commit here 建议正确的方法仍然是使用宏式调用,而不是 def after_initialize

【问题讨论】:

  • 我正在使用 after_initialize 例如进行建筑物关联。一个示例 after_initialize :build_text, :unless => :text。使用 accept_nested_attributes_for 时非常有用

标签: ruby-on-rails-3 activerecord


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多