簡體   English   中英

Rails + Postgres查詢滿足具有唯一關聯ID的條件的所有記錄

[英]Rails + Postgres query for all records that meet a criteria with a unique association ID

我有一些這樣的代碼:

stages.each do |stage|
  start_activity = stage.activities.where('created_at < ?', @start_time).first
  end_activity   = stage.activities.where('created_at < ?', @end_time).first
  # ...
end

這使我的日志充滿了一些類似以下查詢的屏幕:

Activity Load (0.3ms)  SELECT  "activities".* FROM "activities"
  WHERE "activities"."stage_id" = $1
  AND (created_at < '2017-01-31 08:00:00.000000')
  ORDER BY id DESC, "activities"."created_at" DESC
  LIMIT 1 
  [["stage_id", 11548]]
Activity Load (0.3ms)  SELECT  "activities".* FROM "activities"
  ...

(活動的默認作用域范圍為id DESC

因此,我希望有一種方法可以在單個查詢中獲取每個時間戳所需的所有活動。 這會將我的數量從activity_count * 2減少到2

這是我嘗試過的方法,但我認為此處沒有正確使用distinct

Activity
  .select('DISTINCT ON (stage_id) *')
  .where(stage: stages)
  .where('created_at < ?', @start_time)
  .reorder('id DESC')

哪個噴涌而出:

ActiveRecord::StatementInvalid (PG::InvalidColumnReference: ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON (stage_id) * FROM "activities" WHERE "act...
                            ^
: SELECT DISTINCT ON (stage_id) * FROM "activities" WHERE "activities"."stage_id" IN (11548, 11549, <more ids snipped>, 12432, 12433) AND (created_at < '2017-01-31 08:00:00.000000')  ORDER BY id DESC):

我的意思做的,是在說:給我說有一個所有活動stage_id在數組stages ,其中created_at日期最接近(而不超過)時間戳。 我想回去是在每一個階段,一個單一的活動記錄stages

是否可以在1查詢中而不是stages.count查詢中執行此stages.count

通過查看您的錯誤...

ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions

...我到了這個Stack Overflow帖子

您需要在訂單功能的某處添加“ account_id”。

所以我認為您應該可以...

Activity
  .select('DISTINCT ON (stage_id)')
  .where(stage: stages)
  .where('created_at < ?', @start_time)
  .order(:stage_id, :created_at)

暫無
暫無

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

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