簡體   English   中英

原始sql查詢和使用活動記錄查詢的查詢寫操作給出不同的結果

[英]Raw sql query and query writting using active record query are giving different results

我正在運行兩個查詢,在第一個中,我運行原始sql查詢:

SELECT  drivers.*, shift_timing.* FROM "drivers" 
        LEFT JOIN(SELECT DISTINCT ON (driver_id) driver_id, 
        start_hour, start_minutes, end_hour, end_minutes FROM 
        shift_timings ORDER BY driver_id) AS shift_timing ON 
        drivers.id = shift_timing.driver_id WHERE 
        "drivers"."deleted_at" IS NULL  ORDER BY "drivers"."id" ASC LIMIT 1

這給了我以下輸出:

{"id"=>"1", "driver_name"=>"Narendra Kumar Soni", ...,
 "last_order_id"=>"31550", "last_shift_id"=>"74483", "driver_id"=>"1", 
 "start_hour"=>"7", "start_minutes"=>"0", "end_hour"=>"19", 
 "end_minutes"=>"0"}

但是當我運行以下查詢時,它將完全轉換為原始sql查詢:

Driver.joins('LEFT JOIN(SELECT DISTINCT ON (driver_id) driver_id, 
              start_hour, start_minutes, end_hour, end_minutes FROM 
              shift_timings ORDER BY driver_id) 
              AS shift_timing ON drivers.id = 
              shift_timing.driver_id')
             .select('drivers.*, shift_timing.*').first    

我得到以下結果:

#<Driver id: 1, driver_name: "Narendra Kumar Soni", ...,
, last_order_id: 31550, last_shift_id: 74483>

基本上,活動記錄查詢結果中缺少start_hour,start_minutes,end_hour,end_minutes列,而缺少的列實際上是排班計時表的列。 有人可以解釋為什么會這樣嗎?如何解決?

通常可以使用['name']語法訪問聯接表中['name'] ,因此外觀類似於driver['start_hour']

但是我認為解決該問題的正確方法只是包括shift_timings表,例如

Driver.includes(:shift_timings)

要么刪除select子句,以獲得完整的ActiveRecord對象和用途includes(:shift_timings)替代,或者用pluck只得到你想要作為一個數組的字段:

Driver.joins('LEFT JOIN ...') # As in the question
      .pluck('drivers.driver_name, shift_timings.start_hour, shift_timings.start_minutes') 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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