Rails обратный вызов для эквивалента "after_new" - PullRequest
15 голосов
/ 14 мая 2010

Сейчас я не могу найти способ сгенерировать обратный вызов между строками 1 и 2 здесь:

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

Есть ли способ имитировать то, что фактически будет обратным вызовом after_new? Сейчас я использую after_initialize, но есть потенциальные проблемы с производительностью, поскольку он запускается для множества различных событий.

Ответы [ 3 ]

41 голосов
/ 22 марта 2013

Вы можете использовать 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?"

Осторожно after_initialize запускается каждый раз, когда ActiveRecord делает Foo.new (вызовы типа new, find, first и т. Д.), См. Руководство по рельсам

Так что вы, вероятно, хотите что-то вроде этого 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
3 голосов
/ 15 мая 2010

Если это модель Active Record, after_initialize является правильным способом обработки обратных вызовов после создания объекта. Сам фреймворк делает определенные предположения о том, как объекты будут создаваться из базы данных. Производительность не должна беспокоить, если у вас не возникнет какая-то долгосрочная задача, вызванная в обратном вызове, и в этом случае вам, вероятно, придется переосмыслить стратегию.

Если не модель AR, вы можете создать метод инициализации в вашем объекте и поместить туда код.

Существует ряд других доступных обратных вызовов в зависимости от того, что вы хотите сделать, в том числе after_create (вызывается при создании новой записи).

3 голосов
/ 14 мая 2010

Определите конструктор для Foo и сделайте то, что вам нужно сделать.

Альтернативным решением было бы изучить использование after_initialize, но это может не соответствовать вашим ожиданиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...