1

我正在使用 rails 4.2.1 处理复杂的 SQL 查询

def self.proofreader_for_job(job)
  User.find_by_sql(
    "SELECT * FROM users
     INNER JOIN timers 
     ON users.id = timers.proofreader_id
     INNER JOIN tasks
     ON tasks.id = timers.task_id
     WHERE tasks.job_id = #{job.id}")
end

我的模式是(jobs has_many tasks, tasks has_many timers, and a timer belongs_to a user(role: proofreader) 通过外键proofreader_id)

问题是当我调用该方法时,它返回的是正确用户的电子邮件和属性,但 id 不匹配。

例如 User.proofreader_for_job(job) 返回

[#<User id: 178, email: "testemail@gmail.com">]

testemail@gmail.com 是正确的电子邮件,但我的数据库中没有 id 为 178 的用户。

User.all 只是返回

 [#<User id: 12, email: "fakeemail@gmail.com">,
 #<User id: 11, email: "testemail@gmail.com">]

我在我的 rspec 测试中注意到了这个问题,但它发生在开发和测试环境中。

有谁知道为什么我的方法会返回具有如此高 id 的用户。这是按设计完成的,如果是,为什么?

谢谢你。

4

1 回答 1

1

由于您正在执行“选择 *”,因此您的语句将返回 JOIN 语句中每个表的所有列。因此,当您将 SQL 语句的输出转换为 User 类型时,我认为正在为 User id 抓取错误的“id”列(可能是计时器或任务表)。

尝试明确指定要返回的列,如下所示:

User.find_by_sql(
    "SELECT users.id, users.email FROM users
    INNER JOIN timers 
    ON users.id = timers.proofreader_id
    INNER JOIN tasks
    ON tasks.id = timers.task_id
    WHERE tasks.job_id = #{job.id}")
end
于 2015-03-29T17:14:08.677 回答