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