使用ActiveRecord模型的代理对象 - method_missing有时无法正常工作

时间:2010-10-15 22:06:30

标签: ruby-on-rails activerecord proxy-classes

我一直在使用我的应用程序模型作为定义行为的其他对象的代理。

  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>

我不知道接下来要做什么......当我在box类中直接实现total方法时,它工作得很好......我该怎么做才能解决这个问题?代理不能正常工作吗?

1 个答案:

答案 0 :(得分:1)

我发现Rails并不总是使用initialize来创建模型的新实例。所以我使用了挂钩after_initialize并解决了问题!