Terkadang, Anda ingin menggunakan nama yang berbeda untuk asosiasi yang berbeda. Jika nama yang ingin Anda gunakan untuk asosiasi pada model tidak sama dengan asosiasi pada :throughmodel, Anda bisa menggunakan :sourceuntuk menentukannya.
Saya tidak berpikir paragraf di atas jauh lebih jelas daripada paragraf di dokumen, jadi inilah contohnya. Mari kita asumsikan kita memiliki tiga model Pet,, Dogdan 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
Dalam hal ini, kami telah memilih untuk namespace Dog::Breed, karena kami ingin mengakses Dog.find(123).breedssebagai asosiasi yang bagus dan nyaman.
Sekarang, jika kita sekarang ingin membuat has_many :dog_breeds, :through => :dogsasosiasi Pet, kita tiba-tiba memiliki masalah. Rails tidak akan dapat menemukan :dog_breedsasosiasi Dog, jadi Rails tidak mungkin tahu asosiasi mana yang Dog ingin Anda gunakan. Masukkan :source:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Dengan :source, kami memberi tahu Rails untuk mencari asosiasi yang dipanggil :breedspada Dogmodel (seperti itulah model yang digunakan :dogs), dan gunakan itu.