2012-05-03 8 views
5

Böyle bir senaryo var: Her sonrası başka bir nesneye aitmongoid - kullanarak bir 1..N başvurulan ilişki içinde nesneleri çocukları seçmek için içerir

blog.posts 

, bir belongs_to içinde (Etiket demek, Has_many ilişkisi), bu yüzden yapabilirsiniz: N + 1 sorunu önlemek için

tag.posts 

, ben blog.posts yapabilmek istiyorum, ama aynı zamanda iki sorgular oluşturulur, böylece her yazının ilişkili her etiket kapmak, gönderiler için bir tane ve tüm etiketler için bir tane (gönderiye ait her bir tag_id temelinde).

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

bana tüm mesajları bir blog ait ve ayrıca her bir etiketi yayınıyla ilişkili ve kimlik haritasında koyarak elde alacak olan (sağlanan öyle:

Ben Yapabileceğim mongoid belgelerinde fark etkin).

blog.posts 

ve bir şekilde yukarıdaki istediğim şeyi yapma sorgusu yeniden tanımlamak: sorundur

, ben yapmak istiyorum. Bunu yapmanın bir yolu var mı? Şu anda

Ek süreye tanımlayarak bu hafifletici ediyorum: yapmam böylece

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

blog.posts.with_tags 

ama

blog.posts 

yukarıda yaptığı tercih ediyorum varsayılan olarak.

Şerefe.

cevap

7

Bu, özellikle varsayılan kapsamları elde etmek için kapsamları kullanabilirsiniz. Böylece Mesaj modelinde, böyle modelinizi tanımlayabilirsiniz:

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

Eğer Blog.posts gibi mesajları almak için bir sorgu yapmak her Bu şekilde, mongoid da her biriyle ilişkili tüm etiketleri almak için bir sorgu oluşturur sonrası.

+0

Bunu yapmak için başka bir yolu var mı? yani bir mongoid nesneden mi? – K2xL

İlgili konular