:source
関連付けのhas_one/has_many :through
オプションを理解するのを手伝ってください。 Rails APIの説明は、私にはほとんど意味がありません。
「
has_many
:through => :queries
が使用するソース関連付け名を指定します。名前を関連付けから推測できない場合にのみ使用します。has_many :subscribers, :through => :subscriptions
は、:subscribers
が指定されない限り、Subscription
で:subscriber
または:source
を探します。」
場合によっては、関連付けごとに異なる名前を使用することがあります。モデルの関連付けに使用する名前が:through
モデルの関連付けと異なる場合、:source
を使用して指定できます。
上記の段落はドキュメント内の段落よりもmuch明確ではないと思うので、ここに例を示します。 Pet
、Dog
、およびDog::Breed
の3つのモデルがあるとします。
class Pet < ActiveRecord::Base
has_many :dogs
end
class Dog < ActiveRecord::Base
belongs_to :pet
has_many :breeds
end
class Dog::Breed < ActiveRecord::Base
belongs_to :dog
end
この場合、Dog.find(123).breeds
にニースで便利な関連付けとしてアクセスするため、Dog::Breed
の名前空間を選択しました。
Pet
にhas_many :dog_breeds, :through => :dogs
アソシエーションを作成したい場合、突然問題が発生します。 RailsはDog
で:dog_breeds
アソシエーションを見つけることができないため、Railsはおそらく知ることができません whichDog
使用する関連付け。 :source
を入力:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
:source
を使用すると、RailsにDog
モデルで:breeds
という関連付けを探します(使用されるモデルとして) :dogs
)、およびそれを使用します。
その例を拡張してみましょう。
class User
has_many :subscriptions
has_many :newsletters, :through => :subscriptions
end
class Newsletter
has_many :subscriptions
has_many :users, :through => :subscriptions
end
class Subscription
belongs_to :newsletter
belongs_to :user
end
このコードを使用すると、Newsletter.find(id).users
などの操作を実行して、ニュースレターの購読者のリストを取得できます。ただし、より明確になり、代わりにNewsletter.find(id).subscribers
と入力できるようにするには、ニュースレタークラスを次のように変更する必要があります。
class Newsletter
has_many :subscriptions
has_many :subscribers, :through => :subscriptions, :source => :user
end
users
関連付けの名前をsubscribers
に変更しています。 :source
を指定しない場合、RailsはSubscriptionクラスでsubscriber
と呼ばれる関連付けを探します。購読者のリストを作成するには、Subscriptionクラスでuser
アソシエーションを使用するように指示する必要があります。
最も簡単な答え:
中央のテーブル内の関係の名前です。