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 :through
modello, è possibile utilizzare :source
per 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
, Dog
e 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).breeds
come associazione piacevole e conveniente.
Ora, se ora vogliamo creare has_many :dog_breeds, :through => :dogs
un'associazione Pet
, improvvisamente abbiamo un problema. Rails non sarà in grado di trovare :dog_breeds
un'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 :breeds
sul Dog
modello (dato che è il modello utilizzato :dogs
) e di usarla.