我正在使用 Rails 6,在嘗試從集合中獲取最新記錄時,我注意到 Active Record 中有一個奇怪的行為。這是我所擁有的:
會話.rb
class Session < ApplicationRecord
has_many :participations
end
參與.rb
class Participation < ApplicationRecord
belongs_to :session
end
當我試圖獲得最新的參與時:
Participation.order(created_at: :desc).last
生成的 SQL 查詢如下所示:
SELECT "participations".*
FROM "participations"
ORDER BY "participations"."created_at" ASC
LIMIT $1
請注意,我做了,order(created_at: :desc)但 SQL 使用的是ASC.
但是,如果我將代碼更改為:
Participation.order(created_at: :asc).last
SQL 查詢正在做相反的事情 (a DESC):
SELECT "participations".*
FROM "participations"
ORDER BY "participations"."created_at" DESC
LIMIT $1
有沒有人解釋它為什么會這樣?它是一個 Rails 錯誤嗎?似乎使用lastwithorder會導致此問題。如果我洗掉last,ActiveRecord 正在生成正確的 SQL(使用正確的順序)
編輯
作為一種解決方法,我目前正在使用以下代碼,它與last保持正確排序時完全相同:
Participation.order(created_at: :desc).limit(1)
uj5u.com熱心網友回復:
ActiveRecord 正在為您優化 SQL 陳述句。這
Participation.order(created_at: :desc).last
回傳相同的結果
Participation.order(created_at: :asc).first
但是后一個陳述句更有效,因為它必須遍歷更少的行,所以 Rails 生成 SQL 就好像你是這樣寫的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408209.html
標籤:
上一篇:將用戶重定向到另一個鏈接
下一篇:RailsZeitwerk蛇盒
