Инициализация модуля, смешанного с моделью - PullRequest
1 голос
/ 15 июня 2009

У меня есть это:

class Bullet < ActiveRecord::Base  
  include StagedVersionMethods
  ...
end

А это

module StagedVersionMethods     
  def initialize
    puts self.bullet_id
  end
end

Когда я создаю экземпляр Bullet, метод инициализации модулей запускается, но я получаю ошибку ActiveRecord: ... activerecord-2.2.2 / lib / active_record / attribute_methods.rb: 268: в `read_attribute '

Мое намерение - инициализировать переменную экземпляра, для которой мне нужно значение первичного ключа записи, в которую я микширую. Другие методы в модуле будут работать с этой переменной экземпляра.

Функция обратного вызова module () также не подходит для этой задачи, поскольку self в этом контексте является Module, а не AR-записью.

Как к этому приблизиться?

Спасибо

Ответы [ 2 ]

4 голосов
/ 15 июня 2009

Переопределение инициализатора в ActiveRecord может иметь странные побочные эффекты, которые трудно отладить, поэтому это не рекомендуется. Рекомендуемый подход заключается в использовании обратного вызова: after_initialize, предоставляемого ActiveRecord. Вы все еще можете смешивать это поведение через модуль ...

module MyCleverMixin  

  def after_initialize
    puts "I'm Initializing!"
  end

end


class MyModel < ActiveRecord

  include MyCleverMixin

end
0 голосов
/ 15 июня 2009

Если вы определите инициализацию как:

def initialize(*atts)
  super(*atts)
  puts self.bullet_id
end

тогда я думаю, что он будет делать то, что вы хотите, так как он правильно настроит объект, используя инициализацию ActiveRecord. Однако я не уверен, насколько надежен этот подход для того, чего вы пытаетесь достичь. Возможно, было бы более целесообразно создавать эту переменную экземпляра при обращении к ней, а не при инициализации объекта.

Трудно сказать, не зная, что вы хотите, чтобы переменная экземпляра делала.

...