Иногда вы хотите использовать разные имена для разных ассоциаций. Если имя, которое вы хотите использовать для ассоциации в модели, не совпадает с именем в модели :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
) и используйте ее.