Trong ActiveRecord, has_many :through, and Polymorphic Associations, ví dụ của OP thì yêu cầu bỏ qua lớp cha có thể có của Alien
và Person
(SentientBeing
). Đây là câu hỏi của tôi.ActiveRecord, has_many: thông qua, hiệp hội đa hình với STI
class Widget < ActiveRecord::Base
has_many :widget_groupings
has_many :people, :through => :widget_groupings, :source => :person, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :alien, :source_type => 'Alien'
end
SentientBeing < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end
class Person < SentientBeing
end
class Alien < SentientBeing
end
Trong ví dụ sửa đổi này grouper_type
giá trị cho Alien
và Person
lúc này đã được lưu trữ bởi Rails như SentientBeing
(Rails tìm ra các lớp cơ sở cho giá trị grouper_type
này).
Cách thích hợp để sửa đổi has_many
trong Widget
để lọc theo loại trong trường hợp này là gì? Tôi muốn có thể làm Widget.find(n).people
và Widget.find(n).aliens
, nhưng hiện tại cả hai phương pháp này (.people
và .aliens
) trả lại bộ trống []
vì grouper_type
luôn là SentientBeing
.
Câu hỏi này rất giống với câu hỏi [Tôi đã đăng trước đó] [1]. Đó là một vấn đề thú vị bởi vì, như bạn đã nói, thuộc tính 'grouper_type' chỉ lưu trữ siêu lớp. Có vẻ như những gì cần thiết là một sự kết nối giữa các widget và các bảng sentient_beings. Một truy vấn dài dòng hơn như truy vấn tôi đã sử dụng có lẽ sẽ hiệu quả với bạn, nhưng nó không đẹp - vì thế lý do tôi hỏi câu hỏi của tôi. [1]: http://stackoverflow.com/questions/6582588/rails-structuring-a-query-involving-a-polymorphic-association-and-sti – JamesDS
<3 ẩn danh bỏ phiếu. – deefour