Manchmal möchten Sie unterschiedliche Namen für unterschiedliche Zuordnungen verwenden. Wenn der Name, den Sie für eine Zuordnung im Modell verwenden möchten, nicht mit der Zuordnung im :through
Modell übereinstimmt , können Sie ihn :source
angeben.
Ich denke nicht, dass der obige Absatz viel klarer ist als der in den Dokumenten, also hier ein Beispiel. Nehmen wir an , wir haben drei Modelle Pet
, Dog
und Dog::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
In diesem Fall haben wir uns für den Namespace von entschieden Dog::Breed
, da wir Dog.find(123).breeds
als nette und bequeme Zuordnung darauf zugreifen möchten .
Wenn wir jetzt eine has_many :dog_breeds, :through => :dogs
Assoziation erstellen möchten Pet
, haben wir plötzlich ein Problem. Rails kann keine :dog_breeds
Zuordnung finden Dog
, daher kann Rails möglicherweise nicht wissen, welche Dog
Zuordnung Sie verwenden möchten. Geben Sie ein :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Mit :source
weisen wir Rails an , nach einer Zuordnung:breeds
Dog
zu suchen, die für das Modell aufgerufen wird (da dies das verwendete Modell ist :dogs
), und diese zu verwenden.