2011-07-05 38 views
9

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 AlienPerson(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 AlienPerson 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).peopleWidget.find(n).aliens, nhưng hiện tại cả hai phương pháp này (.people.aliens) trả lại bộ trống []grouper_type luôn là SentientBeing.

+0

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

+0

<3 ẩn danh bỏ phiếu. – deefour

Trả lời

13

Bạn đã thử điều đơn giản nhất - thêm :conditions vào has_many :through s?

Nói cách khác, một cái gì đó như thế này (trong widget.rb):

has_many :people, :through => :widget_groupings, :conditions => { :type => 'Person' }, :source => :grouper, :source_type => 'SentientBeing' 
has_many :aliens, :through => :widget_groupings, :conditions => { :type => 'Alien' }, :source => :grouper, :source_type => 'SentientBeing' 

JamesDS là đúng rằng một tham gia là cần thiết - nhưng nó không được viết ra ở đây, kể từ khi hiệp hội has_many :through đã làm việc đó.

+0

Cảm ơn rất nhiều, đây là những gì tôi đang tìm kiếm. – deefour

Các vấn đề liên quan