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