Ruby on rails Rails 3在一个查询中包含多个表

Ruby on rails Rails 3在一个查询中包含多个表,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在为锦标赛开发rails应用程序。我在这个查询中使用了三种模型: class Player < ActiveRecord::Base validates :name, :uniqueness => true has_and_belongs_to_many :tournaments class Tournament < ActiveRecord::Base belongs_to :tournament_type has_and_belongs_to_many

我正在为锦标赛开发rails应用程序。我在这个查询中使用了三种模型:

class Player < ActiveRecord::Base
  validates :name, :uniqueness => true
  has_and_belongs_to_many :tournaments

class Tournament < ActiveRecord::Base
  belongs_to :tournament_type
  has_and_belongs_to_many :players
  has_many :player_matches, :dependent => :destroy

class PlayerMatch < ActiveRecord::Base
  belongs_to :player_one, :class_name => "Player", :foreign_key => "player_one"
  belongs_to :player_two, :class_name => "Player", :foreign_key => "player_two"
虽然锦标赛和玩家_比赛在单个连接中完成,但会单独查询玩家,因为我的代码依赖于他们:

Player Load (0.4ms)  SELECT `players`.*, t0.tournament_id as the_parent_record_id FROM `players` INNER JOIN `players_tournaments` t0 ON `players`.id = t0.player_id WHERE (t0.tournament_id = 14)
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 5 LIMIT 1
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 9 LIMIT 1
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 1 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 8 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 3 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 2 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 7 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 6 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 4 LIMIT 1
我怎样才能将其更改为一个查询?

锦标赛。其中(:id=>params[:id])。包括([{:player\u matches=>:player\u one},:players])。first()

这应该能奏效。实际上,数组表示法和散列表示法的组合在一开始排序时有点混乱,但是使用控制台,您会发现哪种语法不会崩溃:)

将其作为注释扔掉,因为类似的东西修复了我的N+1问题,但我不确定它是否适用于您。如果您将
includes
调用更改为
includes(:player\u matches=>:players)
,您会得到什么结果?另外,将其丢弃。。。确保您查看的是生产模式中使用的SQL,而不是开发模式。您尚未在生产模式中运行此SQL。该输出来自终端中的服务器控制台,与日志一样,因此我知道我有正确的输出:)。我复制了Rails 3.0.3的确切设置,但没有得到相同的输出。第一个“玩家加载”行是一次加载所有玩家的行,也是我得到的唯一一个。您的输出真的仅仅是执行那一行代码吗?我的猜测是,在你看来,你是在循环浏览玩家。我会关闭您的服务器,打开Rails控制台,并在development.log中查看SQL时执行这一行。是的,我有一个集合,它已传递给一个分部。然后部分循环通过它。感谢您的回复。不过,我仍然会收到多个播放器的查询:(。我想知道我的问题是否在于如何使用数据,或者数据库的结构如何。
Player Load (0.4ms)  SELECT `players`.*, t0.tournament_id as the_parent_record_id FROM `players` INNER JOIN `players_tournaments` t0 ON `players`.id = t0.player_id WHERE (t0.tournament_id = 14)
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 5 LIMIT 1
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 9 LIMIT 1
Player Load (0.2ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 1 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 8 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 3 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 2 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 7 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 6 LIMIT 1
Player Load (0.1ms)  SELECT `players`.* FROM `players` WHERE `players`.`id` = 4 LIMIT 1