簡體   English   中英

活動記錄find_by_sql和rspec Expect塊。 無故創建新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任務任務,以及一個定時器,通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM