[英]How to write this ActiveRecord Query using Join instead of subquery in 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
。 有誰知道寫這個查詢的更好方法?
將has_many:through關聯添加到您的用戶模型:
class User < ActiveRecord::Base
has_many :events
has_many :members, :through => :events
end
現在,您可以通過members關聯查詢所有用戶的成員:
user.members
生成的SQL將類似於:
SELECT "members".* FROM "members" INNER JOIN "events" ON "members"."id" = "events"."member_id" WHERE "events"."user_id" = 1
轉換為JOIN語法(使用表別名使其更短且更易於閱讀):
SELECT m.*
FROM events e
JOIN members m ON m.event_id = e.id
WHERE e.user_id = $1
我想這會起作用。
Member.joins(:event).where("events.user_id = ?" , current_user.id)
您可以執行以下操作:
Member.joins(:event).where(events: {user_id: current_user.id})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.