Czasami chcesz użyć różnych nazw dla różnych skojarzeń. Jeśli nazwa, której chcesz użyć dla powiązania w modelu, nie jest taka sama jak przypisanie w :throughmodelu, możesz jej użyć :source.
Nie sądzę, aby powyższy akapit był o wiele jaśniejszy niż ten w dokumentacji, więc oto przykład. Załóżmy, że mamy trzy modele Pet, Dogi 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
W tym przypadku wybraliśmy przestrzeń nazw Dog::Breed, ponieważ chcemy uzyskać dostęp Dog.find(123).breedsjako miłe i wygodne skojarzenie.
Teraz, jeśli chcemy teraz utworzyć has_many :dog_breeds, :through => :dogspowiązanie Pet, nagle mamy problem. Railsy nie będą w stanie znaleźć :dog_breedspowiązania Dog, więc Railsy nie mogą wiedzieć, z którego Dog skojarzenia chcesz skorzystać. Wpisz :source:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Z :source, mówimy szyn szukać stowarzyszenie o nazwie :breedsna Dogmodelu (jak to model używany do :dogs), a stosowanie tego.