【发布时间】: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