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