在rails中,如何查询连接表中的字段?

时间:2014-11-29 14:28:59

标签: mysql sql ruby-on-rails

在rails中,我有两个模型,:contest:problem。每场比赛都有很多问题,问题可能属于很多比赛。不同比赛中的问题,可能有不同的“索引”。

我使用模型:contest_problem加入:contest:problem。在:contest_problem中,我有一个字段index,用于标记竞赛中问题的“索引”。

现在,当我执行Contest.find(...).problems.find(...)...是我要查询的contest_id或problem_id时),rails将创建一个SQL查询:

SELECT `problems`.*
    FROM `problems`
    INNER JOIN `contest_problems` ON `problems`.`id` = `contest_problems`.`problem_id`
    WHERE `contest_problems`.`contest_id` = 1 AND `problems`.`id` = 1
    LIMIT 1

我想执行这个SQL查询:

SELECT `problems`.*, `contest_problems`.`index`
    FROM `problems`
    INNER JOIN `contest_problems` ON `problems`.`id` = `contest_problems`.`problem_id`
    WHERE `contest_problems`.`contest_id` = 1 AND `problems`.`id` = 1
    LIMIT 1

我应该怎么做轨道?


型号:

class Contest < ActiveRecord::Base
  has_many :contest_problems
  has_many :problems, through: :contest_problems
end

class Problem < ActiveRecord::Base
  has_many :contest_problems
  has_many :contests, through: :contest_problems
end

class ContestProblem < ActiveRecord::Base
  belongs_to :contest
  belongs_to :problem
end

迁移:

class CreateContestProblems < ActiveRecord::Migration
  def change
    create_table :contest_problems do |t|
      t.integer :contest_id
      t.integer :problem_id
      t.string  :index,     limit: 2

      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:0)

尝试此查询:

Problem.includes(:contests, :contest_ problems)
  .where(@problem.id)
  .where(contests: { id: @contest.id } ).first

这将在一次数据库查询中为您提供所需的信息。