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 :through
model, Anda bisa menggunakan :source
untuk 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
,, Dog
dan 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).breeds
sebagai asosiasi yang bagus dan nyaman.
Sekarang, jika kita sekarang ingin membuat has_many :dog_breeds, :through => :dogs
asosiasi Pet
, kita tiba-tiba memiliki masalah. Rails tidak akan dapat menemukan :dog_breeds
asosiasi 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 :breeds
pada Dog
model (seperti itulah model yang digunakan :dogs
), dan gunakan itu.