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