1. ホーム
  2. ruby-on-rails-3

[解決済み】Railsのhas_one/has_manyの:sourceオプションについて理解する。

2022-04-13 09:03:57

質問

を理解するのを助けてください。 :source のオプションは has_one/has_many :through の関連付けを行います。Rails APIの説明では、ほとんど意味がわかりません。

で使用されるソースアソシエーション名を指定します。 has_many :through => :queries . から名前を推測できない場合のみ使用します。 を連想させる。 has_many :subscribers, :through => :subscriptions 意志 のどちらかを探します。 :subscribers または :subscriber オン Subscription , がなければ :source が指定されています。

解決方法は?

時には、異なるアソシエーションに対して異なる名前を使用したい場合があります。もし、モデル上のアソシエーションに使いたい名前が :through モデルを使用する場合は :source で指定します。

私は、上記の段落は 大いに の方が分かりやすいので、ドキュメントにあるような例を紹介します。3つのモデルがあるとします。 Pet , DogDog::Breed .

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::Breed にアクセスしたいからです。 Dog.find(123).breeds を、便利で素敵な関連付けとして使うことができます。

さて、ここで has_many :dog_breeds, :through => :dogs の関連付けは Pet となると、突然問題が発生します。Railsは :dog_breeds の関連付けは Dog であるため、Railsは どの Dog のアソシエーションを使用します。入力する :source :

class Pet < ActiveRecord::Base
  has_many :dogs
  has_many :dog_breeds, :through => :dogs, :source => :breeds
end

:source をRailsに伝えています。 というアソシエーションを探します。 :breeds の上で Dog モデル (に使われているモデルなので)。 :dogs を作成し、それを使用します。