【发布时间】:2011-02-19 15:24:18
【问题描述】:
现在我找不到在第 1 行和第 2 行之间生成回调的方法:
f = Foo.new
f.some_call
f.save!
有没有办法模拟什么是有效的 after_new 回调?现在我正在使用 after_initialize 但使用它存在潜在的性能问题,因为它会触发许多不同的事件。
【问题讨论】:
标签: ruby-on-rails activerecord callback
现在我找不到在第 1 行和第 2 行之间生成回调的方法:
f = Foo.new
f.some_call
f.save!
有没有办法模拟什么是有效的 after_new 回调?现在我正在使用 after_initialize 但使用它存在潜在的性能问题,因为它会触发许多不同的事件。
【问题讨论】:
标签: ruby-on-rails activerecord callback
您可以使用after_initialize 回调
# app/models/foo.rb
class Foo < ActiveRecord::Base
after_initialize :some_call
def some_call
puts "Who you gonna call?"
end
end
# rails console
> foo = Foo.new # => "Who you gonna call?"
> foo = Foo.first # => "Who you gonna call?"
请注意,每次 ActiveRecord 执行 Foo.new(如 new、find、first 等调用)时都会触发 after_initialize,请参阅 Rails Guide
所以你可能想要这样的东西after_initialize :some_call, :if => :new_record?
# app/models/foo.rb
class Foo < ActiveRecord::Base
after_initialize :some_call, :if => :new_record?
def some_call
puts "Who you gonna call?"
end
end
# rails console
> foo = Foo.new # => "Who you gonna call?"
> foo = Foo.first
【讨论】:
为Foo 定义一个构造函数并在那里做你需要做的事情。
另一种解决方案是考虑使用after_initialize,但这可能不会达到您的预期。
【讨论】:
如果这是一个 Active Record 模型,那么 after_initialize 是在对象创建后处理回调的正确方法。框架本身对从数据库创建对象的方式做出了某些假设。除非您在回调中触发了一些长时间运行的任务,否则性能不应成为问题,在这种情况下,您可能需要重新考虑策略。
如果不是 AR 模型,您可以在对象中创建一个初始化方法并将代码放在那里。
根据您想要执行的操作,还有许多其他可用的回调,包括 after_create(在创建新记录时调用)。
【讨论】: