A volte, si desidera utilizzare nomi diversi per associazioni diverse. Se il nome che si desidera utilizzare per un'associazione sul modello non è lo stesso dell'associazione sul :throughmodello, è possibile utilizzare :sourceper specificarlo.
Non penso che il paragrafo sopra sia molto più chiaro di quello nei documenti, quindi ecco un esempio. Supponiamo che abbiamo tre modelli, Pet, Doge 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
In questo caso, abbiamo scelto lo spazio dei nomi Dog::Breed, perché vogliamo accedere Dog.find(123).breedscome associazione piacevole e conveniente.
Ora, se ora vogliamo creare has_many :dog_breeds, :through => :dogsun'associazione Pet, improvvisamente abbiamo un problema. Rails non sarà in grado di trovare :dog_breedsun'associazione Dog, quindi Rails non può sapere quale Dog associazione desideri utilizzare. Inserisci :source:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Con :source, stiamo dicendo a Rails di cercare un'associazione chiamata :breedssul Dogmodello (dato che è il modello utilizzato :dogs) e di usarla.