[英]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任務任務,以及一個定時器,通過foriegn鍵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的用戶? 這是設計使然嗎,為什么呢?
謝謝。
由於您正在執行“選擇*”,因此您的語句將返回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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.