2011-04-08 8 views
8

मैं निम्नलिखित मॉडल:परिसर ActiveRecord के साथ शामिल हों और रेल 3

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class Post < ActiveRecord::Base 
    belongs_to :group 
end 

मैं उन सभी पोस्ट को समूह जहां उपयोगकर्ता सदस्य है के हैं खोजने के लिए। मैं इस विधि के साथ यह बना दिया है:

@post = Post.joins(:group => {:memberships => :user}).where(:memberships => {:user_id => current_user.id}) 

लेकिन यह unefficient एसक्यूएल का उत्पादन:

SELECT posts.* FROM posts INNER JOIN memberships ON memberships.group_id = posts.group_id WHERE memberships.user_id = 1 

मैं बिना यह कैसे कर सकते:

SELECT "posts".* FROM "posts" INNER JOIN "groups" ON "groups"."id" = "posts"."group_id" INNER JOIN "memberships" ON "memberships"."group_id" = "groups"."id" INNER JOIN "users" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."user_id" = 1 

मैं इस तरह एक प्रश्न बनाना चाहते कच्चे एसक्यूएल का उपयोग कर?

उत्तर

7

कुछ इस तरह, आप के लिए काम करना चाहिए, हालांकि यह एक छोटे से कच्चे एसक्यूएल

Post.joins("INNER JOIN memberships ON memberships.group_id = posts.group_id").where(:memberships => {:user_id => current_user.id}) 
+0

को संकलित करता है कैसे आप भी समूह तालिका से विशिष्ट स्तंभों का चयन करते हैं? –

14

आप सब पर अपने मॉडल में परिवर्तन, अप्रयुक्त को हटाने के द्वारा बिना करीब प्राप्त कर सकते हैं अपने कॉल से शामिल होने में मिश्रण की आवश्यकता है:

Post.joins(group: :memberships).where(memberships: { user_id: 1 }) 

एसक्यूएल

SELECT "posts".* FROM "posts" 
INNER JOIN "groups" ON "groups"."id" = "posts"."group_id" 
INNER JOIN "memberships" ON "memberships"."group_id" = "groups"."id" 
WHERE ("memberships"."user_id" = 1) 
संबंधित मुद्दे