10

Khi làm việc với một liên kết đa hình, có thể chạy bao gồm trên các mô hình phụ chỉ có trong một số loại không?Ruby on Rails:: bao gồm một liên kết đa hình với submodels

Ví dụ:

class Container 
    belongs_to :contents, :polymorphic => true 
end 
class Food 
    has_one :container 
    belongs_to :expiration 
end 
class Things 
    has_one :container 
end 

Trong giao diện tôi sẽ muốn làm một cái gì đó như:

<% c = Containers.all %> 
<% if c.class == Food %> 
    <%= food.expiration %> 
<% end %> 

Vì vậy, tôi muốn tải háo hức sự hết hạn khi tôi tải lên c bởi vì tôi biết tôi sẽ cần mọi người trong số họ. Có cách nào để làm như vậy không? Chỉ cần xác định một thường xuyên: bao gồm được tôi lỗi vì không phải tất cả các loại kèm theo có một submodel hết hạn.

Trả lời

24

Edited trả lời

Gần đây tôi phát hiện ra rằng Rails hỗ trợ tải háo hức của các hiệp hội đa hình khi bạn lọc theo cột kiểu đa hình. Vì vậy, không cần khai báo các hiệp hội giả mạo.

class Container 
    belongs_to :content, :polymorphic => true 
end 

Bây giờ truy vấn Container bởi container_type.

containers_with_food = Container.find_all_by_content_type("Food", 
          :include => :content) 

containers_with_thing = Container.find_all_by_content_type("Thing", 
          :include => :content) 

Old trả lời

Đây là một hack như không có cách trực tiếp để bao gồm các đối tượng đa hình trong một truy vấn.

class Container 
    belongs_to :contents, :polymorphic => true 
    # add dummy associations for all the contents. 
    # this association should not be used directly 
    belongs_to :food 
    belongs_to :thing 
end 

Bây giờ truy vấn Container bởi container_type.

containers_with_food = Container.find_all_by_content_type("Food", 
          :include => :food) 

containers_with_thing = Container.find_all_by_content_type("Thing", 
          :include => :thing) 

Đó kết quả trong hai SQL cuộc gọi đến cơ sở dữ liệu (trên thực tế nó là 4 cuộc gọi như đường ray thực thi một lệnh SQL cho mỗi :include)

Không có cách nào để làm điều này trong một SQL như bạn cần cột khác nhau đặt cho các loại nội dung khác nhau.

Lưu ý: Không nên sử dụng trực tiếp các liên kết giả trên lớp Content vì kết quả không mong muốn.

Ví dụ: Cho phép nói đối tượng đầu tiên trong bảng contents chứa thực phẩm.

Content.first.food # will work 
Content.first.thing 

Cuộc gọi thứ hai sẽ không hoạt động. Nó có thể cung cấp cho bạn một đối tượng Thing có cùng id với đối tượng Food được chỉ bởi Content.

+0

Tôi đã cập nhật câu trả lời của mình dựa trên một số thông tin mới, hãy xem. –

+1

Phiên bản ActiveRecord nào hoạt động tích cực khi tải các liên kết đa hình hoạt động? Nó không hoạt động với tôi trong 3.2.3 – nicholaides

+0

@nicholaides Nó sẽ hoạt động trong 3.2.3. Việc tải mong muốn xảy ra chỉ khi bạn lọc theo cột loại đa hình. Lỗi bạn gặp phải là gì? –

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