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 :through
modelo, puede usarlo :source
para 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
, Dog
y 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).breeds
como una asociación agradable y conveniente.
Ahora, si ahora queremos crear una has_many :dog_breeds, :through => :dogs
asociación Pet
, de repente tenemos un problema. Rails no podrá encontrar una :dog_breeds
asociació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 :breeds
en el Dog
modelo (ya que ese es el modelo utilizado :dogs
), y que la use.