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
.
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. –
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
@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ì? –