我一直在使用我的应用程序模型作为定义行为的其他对象的代理。
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 对象上实现了所有方法,当我在一个盒子实例上调用一个方法时,它会将调用重定向到关联的 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>
而且我不知道下一步该做什么......当我直接在盒子类中实现总方法时,它工作正常......我能做些什么来解决这个问题?代理工作不正常吗?