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