À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 :throughmodelo, 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, Doge 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).breedscomo uma associação agradável e conveniente.
Agora, se agora queremos criar uma has_many :dog_breeds, :through => :dogsassociação Pet, de repente temos um problema. O Rails não conseguirá encontrar uma :dog_breedsassociaçã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 :breedsno Dogmodelo (como esse é o modelo usado :dogs) e usá-lo.