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 :throughModell übereinstimmt , können Sie ihn :sourceangeben.
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, Dogund 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).breedsals nette und bequeme Zuordnung darauf zugreifen möchten .
Wenn wir jetzt eine has_many :dog_breeds, :through => :dogsAssoziation erstellen möchten Pet, haben wir plötzlich ein Problem. Rails kann keine :dog_breedsZuordnung 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 :sourceweisen wir Rails an , nach einer Zuordnung:breedsDog zu suchen, die für das Modell aufgerufen wird (da dies das verwendete Modell ist :dogs), und diese zu verwenden.