4

今日、いくつかの魔法に出くわしました。情報に基づいたコードを記述できるように、それを理解するのに役立つことを願っています。

私のアプリには、次の 3 つのクラスがあります。

class Person < ActiveRecord::Base
  has_many :selected_apps
  has_many :app_profiles, through: :selected_apps do
    def unselected(reload=false)
      @unselected_app_profiles = nil if reload
      @unselected_app_profiles ||= proxy_association.owner.app_profile_ids.empty? ?
        AppProfile.all :
        AppProfile.where("id NOT IN (?)", proxy_association.owner.app_profile_ids)
    end
  end
end

class AppProfile < ActiveRecord::Base
end

class SelectedApp < ActiveRecord::Base
  belongs_to :person
  belongs_to :app_profile
end

上記のコードを使用すると、現在 に関連付けられていないperson.app_profiles.unselectedすべての を取得したり取得したりできます。多くの SQL 作業を行う必要はありません。素晴らしい!AppProfilesPerson

私の問題は、私がコードを理解していないことです - それはいつも私を不安にさせます. proxy_association のドキュメントを調べてみましたが、かなり不透明でした。

誰かが合理的に簡単な説明や詳細を学ぶのに適した場所を提供できますか?

4

1 に答える 1

11

基本的に、selfを拡張しながら呼び出すとassociation、インスタンスは返されずAssociation、代わりに に委譲されto_aます。

それを試してみてください:

class Person < ActiveRecord::Base
  has_many :app_profiles, through: :selected_apps do
    def test_me
      self
    end
  end
end

association関連付け自体を拡張しているときに、実際のオブジェクトに到達する必要がある場合があります。proxy_associationメソッドを入力すると、、、および属性associationを含むが得られます。ownertargetreflection

参考までに、ドキュメントはこちらです。

この質問は、 のより単純な使用例を提供しますproxy_association.owner

于 2012-05-02T02:07:11.953 に答える