Parfois, vous voulez utiliser des noms différents pour les 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'association sur l' :through
modèle, vous pouvez utiliser :source
pour le spécifier.
Je ne pense pas que le paragraphe ci-dessus est beaucoup plus claire que celle dans les docs, donc voici un exemple. Imaginons que nous avons 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'espace de noms de l' Dog::Breed
, parce que nous voulons accéder Dog.find(123).breeds
comme un joli et pratique de l'association.
Maintenant, si nous voulons maintenant créer un has_many :dog_breeds, :through => :dogs
association sur Pet
, nous avons soudain un problème. Rails de ne pas être en mesure de trouver un :dog_breeds
association sur Dog
, de sorte que les Rails ne peux pas le savoir qui Dog
association que vous souhaitez utiliser. Entrez :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Avec :source
, nous racontons des Rails de regarder pour une association qui s'appelle :breeds
sur le Dog
modèle (c'est le modèle utilisé pour l' :dogs
), et de l'utiliser.