A veces, desea utilizar diferentes nombres para diferentes asociaciones. Si el nombre que desea usar para una asociación en el modelo no es el mismo que la asociación en el :throughmodelo, puede usarlo :sourcepara especificarlo.
No creo que el párrafo anterior sea mucho más claro que el de los documentos, así que aquí hay un ejemplo. Supongamos que tenemos tres modelos Pet, Dogy 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
En este caso, hemos elegido el espacio de nombres Dog::Breed, porque queremos acceder Dog.find(123).breedscomo una asociación agradable y conveniente.
Ahora, si ahora queremos crear una has_many :dog_breeds, :through => :dogsasociación Pet, de repente tenemos un problema. Rails no podrá encontrar una :dog_breedsasociación Dog, por lo que Rails no puede saber qué Dog asociación desea utilizar. Ingrese :source:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Con :source, le estamos diciendo a Rails que busque una asociación llamada :breedsen el Dogmodelo (ya que ese es el modelo utilizado :dogs), y que la use.