Rails回调相当于“after_new”

时间:2010-05-14 17:26:31

标签: ruby-on-rails activerecord callback

现在我无法找到在第1行和第2行之间生成回调的方法:

f = Foo.new
f.some_call
f.save!

有没有办法模拟什么是有效的after_new回调?现在我正在使用after_initialize但是使用它有潜在的性能问题,因为它会触发很多不同的事件。

3 个答案:

答案 0 :(得分:41)

您可以使用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执行after_initializeFoo.newnewfind等调用)时,请注意first。{{3} }}

所以你可能想要这样的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

答案 1 :(得分:3)

Foo定义构造函数,并执行您需要执行的操作。

另一种解决方案是使用after_initialize进行调查,但这可能与您的期望不相符。

答案 2 :(得分:3)

如果这是一个Active Record模型,那么after_initialize是在对象创建后处理回调的正确方法。框架本身对从数据库创建对象的方式做出了某些假设。除非您在回调中触发了一些长时间运行的任务,否则性能不应该是一个问题,在这种情况下,您可能需要重新考虑策略。

如果不是AR模型,您可以在对象中创建初始化方法并将代码放在那里。

根据您的需要,还有许多其他回调可用,包括after_create(在创建新记录时调用)。