Прокси-объекты с моделями ActiveRecord - method_missing иногда не работает - PullRequest
1 голос
/ 16 октября 2010

Я использовал модель своего приложения в качестве прокси для других объектов, определяющих поведение.

  class Box < ActiveRecord::Base

  belongs_to :box_behavior, :polymorphic => true, :validate => true, :foreign_key => 'box_behavior_id', :dependent => :destroy

  [...]

  def initialize(opts = {})
    super(opts)
    self.box_behavior = BoxBehaviorDefault.new if self.box_behavior.blank?
  end

  private
    def method_missing(method, *args, &block)
      super
      rescue NoMethodError
        return self.box_behavior.send(method,*args,&block)
    end
end

Таким образом, я реализую все методы в моих объектах BoxBehavior, и когда я вызываю метод для экземпляра box, он перенаправляет вызов на связанный объект boxbehavior. Все работает нормально, за исключением случаев, когда я пытался создать хук на своей модели покупки, где он получает сумму от своего объекта-бокса и сохраняет ее:

class Purchase < ActiveRecord::Base

  belongs_to :box

  before_validation_on_create { |r| r.total = r.box.total }
end

Когда я пытаюсь сохранить любой объект покупки, с которым связан ящик, я получаю эту ошибку:

undefined method `total' for #<ActiveRecord::Associations::BelongsToAssociation:0x7fe944320390>

И я понятия не имею, что делать дальше ... Когда я реализую метод total непосредственно в классе box, тогда он работает нормально ... что я могу сделать, чтобы решить эту проблему? Не работает ли прокси должным образом?

1 Ответ

1 голос
/ 16 октября 2010

Я обнаружил, что Rails не всегда использует инициализацию для создания нового экземпляра модели. Поэтому я использовал хук after_initialize и решил проблему!

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