A pool_tournament
有許多pool_tournament_matches
,每個匹配屬於多個users
。用戶has_many pool_tournaments
和has_many pool_tournament_matches
。如何在單個查詢中獲得此查詢結果而不是N + 1
pool_tournament.rb
has_many :pool_tournament_matches
pool_tournament_match.rb
belongs_to :pool_tournament
has_many :pool_tournament_match_users, class_name: 'PoolTournamentMatchUser'
has_many :users, through: :pool_tournament_match_users
user.rb
has_many :pool_tournament_users, class_name: 'PoolTournamentUser'
has_many :pool_tournaments, through: :pool_tournament_users
has_many :pool_tournament_match_users, class_name: 'PoolTournamentMatchUser'
has_many :pool_tournament_matches, through: :pool_tournament_match_users
有2的has_many通過協會在這裏。一個是在user
和pool_tournament
之間。另一個是在pool_tournament_match
和user
之間。
我的查詢是找出哪個pool_tournament_matches
只有1個用戶。我的查詢向我提供了匹配列表,但它爲每個pool_tournament_match
執行N + 1查詢。
tournament.pool_tournament_matches.includes(:users).select { |m| m.users.count == 1 }
PoolTournamentMatch Load (0.6ms) SELECT "pool_tournament_matches".* FROM "pool_tournament_matches" WHERE "pool_tournament_matches"."pool_tournament_id" = $1 [["pool_tournament_id", 2]]
PoolTournamentMatchUser Load (0.6ms) SELECT "pool_tournament_match_users".* FROM "pool_tournament_match_users" WHERE "pool_tournament_match_users"."pool_tournament_match_id" IN (1, 2, 3, 4)
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (1, 2, 3, 4, 5, 6, 7, 8) (0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "pool_tournament_match_users" ON "users"."id" = "pool_tournament_match_users"."user_id" WHERE "pool_tournament_match_users"."pool_tournament_match_id" = $1 [["pool_tournament_match_id", 1]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "pool_tournament_match_users" ON "users"."id" = "pool_tournament_match_users"."user_id" WHERE "pool_tournament_match_users"."pool_tournament_match_id" = $1 [["pool_tournament_match_id", 2]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "pool_tournament_match_users" ON "users"."id" = "pool_tournament_match_users"."user_id" WHERE "pool_tournament_match_users"."pool_tournament_match_id" = $1 [["pool_tournament_match_id", 3]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "pool_tournament_match_users" ON "users"."id" = "pool_tournament_match_users"."user_id" WHERE "pool_tournament_match_users"."pool_tournament_match_id" = $1 [["pool_tournament_match_id", 4]]
我也不介意使用RAW SQL,如果需要,可以張貼架構。
謝謝!
刪除我的答案,因爲它是不正確的。見http://stackoverflow.com/questions/16348333/rails-includes-with-conditions –