2012-05-03 6 views
5

Tôi có một kịch bản như thế này:mongoid - sử dụng bao gồm để chọn trẻ em các đối tượng trong một mối quan hệ 1..N tham chiếu

blog.posts 

trong đó mỗi bài thuộc về đối tượng khác, nói Tag (trong một belongs_to, mối quan hệ has_many), vì vậy tôi có thể làm:

tag.posts 

để ngăn chặn vấn đề N + 1, tôi muốn để có thể làm blog.posts, mà còn lấy mỗi thẻ đi kèm với mỗi bài, vì vậy mà hai truy vấn được tạo ra, một cho bài viết và một cho tất cả các thẻ (dựa trên mỗi tag_id thuộc bài đăng).

tôi nhận thấy trong tài liệu mongoid tôi có thể làm:

Post.includes(:tag).where(:blog_id: blog.id) 

mà sẽ làm cho tôi tất cả các bài viết thuộc về một blog, và cũng nhận được mỗi thẻ liên quan đến bưu chính đưa vào bản đồ sắc (với điều kiện đó là đã bật).

Vấn đề là, tôi muốn làm:

blog.posts 

và bằng cách nào đó xác định lại truy vấn để làm những gì tôi muốn ở trên. Có cách nào làm được việc này không?

Hiện nay tôi đang giảm nhẹ này bằng cách định nghĩa một phần mở rộng:

has_many :posts do 
    def with_tags 
    includes(:tag) 
    end 
end 

vì vậy mà tôi làm

blog.posts.with_tags 

nhưng tôi muốn rằng

blog.posts 

hiện trên theo mặc định.

Chúc mừng.

Trả lời

7

Bạn có thể sử dụng phạm vi để đạt được điều này, phạm vi mặc định cụ thể. Vì vậy, trong mô hình bài viết của bạn, bạn có thể xác định mô hình của bạn như:

class Post 
    belongs_to :tag 
    default_scope includes(:tag) 
end 

Bằng cách đó bất cứ khi nào bạn làm một truy vấn để có được bài viết, như Blog.posts, mongoid cũng sẽ tạo ra một truy vấn để có được tất cả các thẻ gắn liền với mỗi bài đăng.

+0

có cách nào khác để thực hiện việc này không? tức là từ một đối tượng mongoid? – K2xL