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 :through
modelu, 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
, Dog
i 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).breeds
jako miłe i wygodne skojarzenie.
Teraz, jeśli chcemy teraz utworzyć has_many :dog_breeds, :through => :dogs
powiązanie Pet
, nagle mamy problem. Railsy nie będą w stanie znaleźć :dog_breeds
powią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 :breeds
na Dog
modelu (jak to model używany do :dogs
), a stosowanie tego.