1

私は自分のアプリケーションのモデルを、動作を定義する他のオブジェクトへのプロキシとして使用してきました。

  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>

そして、私は次に何をすべきかについての手がかりを持っていません...私がboxクラスに直接totalメソッドを実装するとき、それはうまくいきます...これを解決するために私は何ができますか?プロキシが正しく機能していませんか?

4

1 に答える 1

1

Railsがモデルの新しいインスタンスを作成するために常にinitializeを使用するとは限らないことがわかりました。だから私はフックafter_initializeを使用して問題を解決しました!

于 2010-10-16T02:11:42.507 に答える