2014-06-30 70 views
1

考慮下面寫的ActiveRecord查詢:如何使用加入,而不是子查詢中的Rails 4

class User < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :user #this user is the event owner 
    has_many :members 
end 

class Members < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :event 
end 

現在,我需要列出所有這些current_user是所有者的成員。所以我想出了這一點:

@members = Member.where event_id: current_user.events 

產生以下查詢:

SELECT "members".* FROM "members" WHERE "members"."event_id" IN (SELECT "events"."id" FROM "events" WHERE "events"."user_id" = 1) 

可正常工作,但使用子查詢,而不是JOIN。有誰知道更好的方式來寫這個相同的查詢?

回答

2

添加的has_many

class User < ActiveRecord::Base 
    has_many :events 
    has_many :members, :through => :events 
end 

現在,您可以查詢用戶通過成員的所有成員協會:

user.members 

生成的SQL將如下所示:

SELECT "members".* FROM "members" INNER JOIN "events" ON "members"."id" = "events"."member_id" WHERE "events"."user_id" = 1 
0

轉化加入語法(以表的別名,使它更短,更易於閱讀):

SELECT m.* 
FROM events e 
JOIN members m ON m.event_id = e.id 
WHERE e.user_id = $1 
+0

我該如何使用'ActiveRecord'生成? – CuriousMind

+0

@CuriousMind:我沒有使用AR,但應該是微不足道的。 –

0

我想這會工作。

Member.joins(:event).where("events.user_id = ?" , current_user.id) 
0

你可以這樣做:通過關聯到你的用戶模式:

Member.joins(:event).where(events: {user_id: current_user.id})