A veces, desea utilizar nombres diferentes para diferentes asociaciones. Si el nombre que desea utilizar para una asociación en el modelo no es el mismo que el asociado en el modelo :through
, puede usar :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 optado por espacio de nombres del Dog::Breed
, porque queremos acceder Dog.find(123).breeds
como una asociación agradable y conveniente.
Ahora, si ahora queremos crear una asociación has_many :dog_breeds, :through => :dogs
en Pet
, de repente tenemos un problema. Rails no podrá encontrar una asociación :dog_breeds
en Dog
, por lo que Rails no puede saber quéDog
asociación que desea utilizar. Introduzca :source
: Carriles
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Con :source
, le estamos diciendo a buscar una asociación llama :breeds
en el modelo Dog
(ya que es el modelo utilizado para :dogs
), y usar eso.
Creo que quisiste que tu Animal de última clase se llamara Mascota de clase, solo un error tipográfico, creo. – Kamilski81
¡Gracias, buena captura! – vonconrad
En el ejemplo anterior, la asociación en 'Perro' debe ser' has_many: breed' en lugar de ': breeds' y luego': source' be ': breed' singular, para representar el nombre del modelo, en lugar de': razas' que representa el nombre de la tabla? P.ej. 'has_many: dog_breeds,: through =>: dogs,: source =>: breed' (no' s' sufijo ': breed')? – LazerSharks