Active Record find_by_sql 和 rspec 期望块。无缘无故创建新 ID

Active Record find_by_sql and rspec expect block. New ids are created for no reason

我正在使用 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

我的模式是(工作has_many任务,任务has_many定时器,定时器belongs_to一个用户(角色:校对员)通过外键proofreader_id)

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

例如User.proofreader_for_job(工作)returns

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

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

User.all只是returns

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

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

有谁知道为什么我的方法会返回具有如此高 ID 的用户。这是设计使然吗,如果是,为什么?

谢谢。

由于您正在执行 'Select *',您的语句将为 JOIN 语句中每个 table 的所有列 return。因此,当您将 SQL 语句的输出转换为用户类型时,我认为错误的 'id' 列被抓取用于用户 ID(可能是计时器或任务 table) .

尝试将列显式指定为 return,如以下语句:

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