我正在使用 Rails 4.2。我有一個具有這些日期時間屬性的模型
submitted_at
created_at
我如何撰寫一個 finder 方法來回傳所有模型,其中 submit_at 欄位按時間順序出現在 created_at 欄位之前?我試過這個
MyModel.where(:submitted_at < :created_at)
但這會回傳我資料庫中的所有內容,甚至是不匹配的專案。
uj5u.com熱心網友回復:
where(:submitted_at < :created_at)實際上是where(false)。當您使用 lt/gt 運算子比較兩個符號時,您實際上只是按字母順序比較它們:
:a < :b # true
:c > :b # true
where(false)或任何其他空白的引數?只回傳一個“無作用域”的鏈接關系。
ActiveRecord 查詢介面并沒有真正直接的方法來比較這樣的列。
您可以使用 SQL 字串:
Resource.where('resources.submitted_at < resources.created_at')
或者使用 Arel 創建查詢:
r = Resource.arel_table
Resource.where(r[:submitted_at].lt(r[:created_at]))
結果完全相同,但 Arel 解決方案可以說更易于移植,并且避免了對表名進行硬編碼(或創建模糊查詢)。
uj5u.com熱心網友回復:
您可以使用.to_sql查看生成的查詢。
對你來說,它看起來像這樣:
Resource.where(:submitted_at < :created_at).to_sql
# => SELECT `resources`.* FROM `resources`
如果你像下面這樣更新,你會得到一些結果:
Resource.where('submitted_at < created_at')
# => SELECT * FROM `resources` WHERE (submitted_at < created_at)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358366.html
