0

我有以下 ActiveRecord (AR) 查询,我遇到了一些非常奇怪的结果。底线概述如下,但 TLDR;AR 查询会产生意外(无)结果,而相同的 AR 查询的原始 SQL(#to_sql)确实会产生预期的结果,无论是来自 Rails 控制台还是Postgres CLI:

# The AR query params...
start_date = end_date = '2021-09-21'
user = User.find(8) # me
    
# The AR query...
results = Entry.joins(:daily_log).select('SUM("entries"."hours") AS lost_hours, SUM("entries"."minutes") AS lost_minutes').
      where(adds_to_hours_worked: true, daily_logs: { calendar_date: [start_date..end_date], user: user })
#=>[#<Entry:0x00007ff289621e88 id: nil>]

# The AR query raw SQL...
puts results.to_sql
#=> (formatted for readability)
SELECT 
  SUM("entries"."hours") AS lost_hours
, SUM("entries"."minutes") AS lost_minutes
FROM "entries" INNER JOIN "daily_logs"
  ON "daily_logs"."id" = "entries"."daily_log_id"
WHERE "entries"."adds_to_hours_worked" = TRUE
  AND "daily_logs"."calendar_date" BETWEEN '2021-09-21' AND '2021-09-21'
  AND "daily_logs"."user_id" = 8;

# Executing the AR query's raw sql returns results!
ActiveRecord::Base.connection.execute(results.to_sql).to_a
#=> [{"lost_hours"=>2, "lost_minutes"=>30}]

从 Postgres CLI 执行 AR 的原始 SQL 会产生预期的结果!

xyz_development=# SELECT
xyz_development-#   SUM("entries"."hours") AS lost_hours
xyz_development-# , SUM("entries"."minutes") AS lost_minutes
xyz_development-# FROM "entries" INNER JOIN "daily_logs"
xyz_development-#   ON "daily_logs"."id" = "entries"."daily_log_id"
xyz_development-# WHERE "entries"."adds_to_hours_worked" = TRUE
xyz_development-#   AND "daily_logs"."calendar_date" BETWEEN '2021-09-21' AND '2021-09-21'
xyz_development-#   AND "daily_logs"."user_id" = 8;
 lost_hours | lost_minutes
------------+--------------
          2 |           30
(1 row)

我还尝试用不同的方式重构 AR 查询,看看是否能产生正确的结果,但不能;不过,我可以通过从 Rails 控制台和 Postgres CLI 执行重构的 AR 的原始 sql 来产生正确的结果:

DailyLog.joins(:entries).select('SUM("entries"."hours") AS lost_hours, SUM("entries"."minutes") AS lost_minutes').
      where(calendar_date: [start_date..end_date], user: user, entries: { adds_to_hours_worked: true })
#=>[#<Entry:0x00002bc249121e77 id: nil>]

任何帮助或见解将不胜感激;出于明显的原因,我宁愿不必求助于原始 SQL。

4

0 回答 0