簡體   English   中英

如何在Rails 4中使用Join而不是子查詢來編寫此ActiveRecord查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM