Đôi khi, bạn muốn sử dụng các tên khác nhau cho các liên kết 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 xác nhận trên mô hình :through
, bạn có thể sử dụng :source
để chỉ định.
Tôi không nghĩ đoạn trên là nhiều hơn rõ ràng hơn so với đoạn trong tài liệu, vì vậy đây là một ví dụ. Giả sử chúng tôi 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 các 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 đẹp và thuận tiện.
Bây giờ, nếu bây giờ chúng tôi muốn tạo liên kết has_many :dog_breeds, :through => :dogs
trên Pet
, chúng tôi đột nhiên gặp sự cố. Rails sẽ không thể tìm thấy một hiệp hội :dog_breeds
trên Dog
, vì vậy Rails không thể nào biết màDog
sự liên kết bạn muốn sử dụng. Nhập :source
: Rails
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
Với :source
, chúng ta đang nói đến nhìn cho một hiệp hội gọi là :breeds
trên Dog
mô hình (như đó là mô hình sử dụng cho :dogs
), và sử dụng.
Tôi nghĩ rằng bạn có nghĩa là cho lớp học cuối cùng của bạn Động vật được gọi là lớp Pet, chỉ là một lỗi đánh máy tôi tin. – Kamilski81
Cảm ơn, hãy bắt! – vonconrad
Trong ví dụ trên, nên liên kết trong 'Dog' là' has_many: breed' thay vì ': breeds' và sau đó là': source' là ': breed' singular, để đại diện cho tên model, thay vì': giống 'đại diện cho tên bảng? Ví dụ. 'has_many: dog_breeds,: through =>: chó,: source =>: breed' (không có' s' suffixing ': breed')? – LazerSharks