Иногда вы хотите использовать разные имена для разных ассоциаций. Если имя, которое вы хотите использовать для ассоциации в модели, не совпадает с ассоциацией на модели :through
, вы можете использовать :source
, чтобы указать ее.
Я не думаю, что вышеприведенный абзац много яснее, чем в документах, так что вот пример. Предположим, у нас есть три модели: Pet
, Dog
и 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
В этом случае, мы выбрали в пространстве имен Dog::Breed
, потому что мы хотим получить доступ к Dog.find(123).breeds
как хорошие и удобным ассоциациям.
Теперь, если мы хотим создать ассоциацию has_many :dog_breeds, :through => :dogs
на Pet
, у нас возникли проблемы. Rails не сможет найти ассоциацию :dog_breeds
, если Dog
, поэтому Rails не может знать , которогоDog
ассоциации которые вы хотите использовать. Введите :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
:source
С, мы говорим Rails для ищет ассоциацию под названием :breeds
на Dog
модели (как это модель, используемая для :dogs
), и использовать его.
Я думаю, что вы предназначались для вашего последнего класса Animal, которого можно назвать классом Pet, просто опечатка, которую я считаю. – Kamilski81
Спасибо, хорошо поймать! – vonconrad
В приведенном выше примере, если ассоциация под 'Dog' будет' has_many: breed' вместо ': breed'', а затем': source' be ': breed' singular, чтобы представить имя модели, а не': породы ", который представляет имя таблицы? Например. 'has_many: dog_breeds,: through =>: dogs,: source =>: breed' (no' s' suffixing ': breed')? – LazerSharks