Я использовал модель своего приложения в качестве прокси для других объектов, определяющих поведение.
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, тогда он работает нормально ... что я могу сделать, чтобы решить эту проблему? Не работает ли прокси должным образом?