Parfois, vous souhaitez utiliser des noms différents pour différentes associations. Si le nom que vous souhaitez utiliser pour une association sur le modèle n'est pas le même que l'assocation sur le :throughmodèle, vous pouvez l'utiliser :sourcepour le spécifier.
Je ne pense pas que le paragraphe ci-dessus soit beaucoup plus clair que celui de la documentation, voici donc un exemple. Supposons que nous ayons trois modèles Pet, Doget 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
Dans ce cas, nous avons choisi d'espacer le nom Dog::Breed, car nous voulons y accéder Dog.find(123).breedscomme une association agréable et pratique.
Maintenant, si nous voulons maintenant créer une has_many :dog_breeds, :through => :dogsassociation sur Pet, nous avons soudainement un problème. Rails ne pourra pas trouver d' :dog_breedsassociation sur Dog, donc Rails ne peut pas savoir quelle Dog association vous souhaitez utiliser. Entrez :source:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Avec :source, nous demandons à Rails de rechercher une association appelée :breedssur le Dogmodèle (car c'est le modèle utilisé pour :dogs), et de l'utiliser.