Іноді для різних асоціацій потрібно використовувати різні назви. Якщо ім'я, яке ви хочете використовувати для асоціації на моделі, не збігається з асоціацією на :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
), і використовувати це.