我想獲得除 [30, 54] 和 language_id: nil 以外的 language_id 的專案總數
LOCALES = {
non_arabic_languages: {
id: [30, 54]
}
}
scope :non_arabic_languages, -> { where.not(language_id: LOCALES[:non_arabic_languages][:id]) || where(language_id: nil) }
這個例子可以預見地回傳第一部分,所以我只得到非阿拉伯語專案。&& 也有問題。我該如何組合它?我們將感謝您的建議!
uj5u.com熱心網友回復:
您陷入了一個常見的陷阱,將 Ruby 中的邏輯操作與通過 ActiveRecord 查詢介面實際創建 SQL 混淆。
使用||將回傳第一個真值:
where.not(language_id: LOCALES[:non_arabic_languages][:id]) || where(language_id: nil)
這是回傳的 ActiveRecord 關系,where.not(language_id: LOCALES[:non_arabic_languages][:id])因為除了 false 和 nil 之外的所有內容在 Ruby 中都是真實的。|| where(language_id: nil)從來沒有被實際評估過。
.orRails 5 中添加了對 的支持。在以前的版本中,最直接的解決方案是使用 Arel 或 SQL 字串:
scope :non_arabic_languages, -> {
non_arabic_languages_ids = LOCALES[:non_arabic_languages].map { |h| h[:id] }
where(arel_table[:language_id].not_in(non_arabic_languages_ids ).or(arel_table[:language_id].eq(nil)))
}
我會留下標記評論(如@fixme),以便您在升級到 5.0 后解決此問題,或者考慮一個更好的解決方案,首先不涉及硬編碼資料庫 ID,例如使用自然鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359528.html
