Às vezes, você deseja usar nomes diferentes para diferentes associações. Se o nome que você deseja usar para uma associação no modelo não for o mesmo que a associação no :through
modelo, você poderá usá :source
-lo para especificá-lo.
Não acho que o parágrafo acima seja muito mais claro que o dos documentos, então aqui está um exemplo. Vamos supor que temos três modelos, Pet
, Dog
e 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
Nesse caso, optamos por namespace the Dog::Breed
, porque queremos acessar Dog.find(123).breeds
como uma associação agradável e conveniente.
Agora, se agora queremos criar uma has_many :dog_breeds, :through => :dogs
associação Pet
, de repente temos um problema. O Rails não conseguirá encontrar uma :dog_breeds
associação Dog
; portanto, o Rails não pode saber em qual Dog
associação você deseja usar. Digite :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Com :source
, estamos dizendo ao Rails para procurar uma associação chamada :breeds
no Dog
modelo (como esse é o modelo usado :dogs
) e usá-lo.