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 :through
modèle, vous pouvez l'utiliser :source
pour 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
, Dog
et 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).breeds
comme une association agréable et pratique.
Maintenant, si nous voulons maintenant créer une has_many :dog_breeds, :through => :dogs
association sur Pet
, nous avons soudainement un problème. Rails ne pourra pas trouver d' :dog_breeds
association 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 :breeds
sur le Dog
modèle (car c'est le modèle utilisé pour :dogs
), et de l'utiliser.