Đôi khi, bạn muốn sử dụng các tên khác nhau cho các hiệp hội khác nhau. Nếu tên bạn muốn sử dụng cho liên kết trên mô hình không giống với tên trên :through
mô hình, bạn có thể sử dụng :source
để chỉ định tên đó.
Tôi không nghĩ rằng đoạn trên là nhiều rõ ràng hơn so với một trong các tài liệu, vì vậy đây là một ví dụ. Giả sử chúng ta có ba mô hình Pet
, Dog
và 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
Trong trường hợp này, chúng tôi đã chọn không gian tên Dog::Breed
, bởi vì chúng tôi muốn truy cập Dog.find(123).breeds
như một hiệp hội tốt và thuận tiện.
Bây giờ, nếu bây giờ chúng tôi muốn tạo một has_many :dog_breeds, :through => :dogs
hiệp hội trên Pet
, chúng tôi đột nhiên có một vấn đề. Rails sẽ không thể tìm được một :dog_breeds
hiệp hội trên Dog
, vì vậy Rails không thể nào biết được Dog
sự liên kết bạn muốn sử dụng. Nhập :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Với :source
, chúng tôi đang nói với Rails tìm kiếm một hiệp hội được gọi :breeds
trên Dog
mô hình (vì đó là mô hình được sử dụng cho :dogs
) và sử dụng nó.