這實際上取決於你想如何處理。
首先,我會將查詢分解爲多個where
s,默認爲AND操作。這是可讀性:
Model.where("country_translations.title ILIKE ?", "%#{search[:title]}%")
.where("country_translations.created_at > ?", search[:created_at_gt])
.where("country_translations.created_at < ?", search[:created_at_lt])
您既可以使用||
運營商通過默認值,如:
Model.where("country_translations.title ILIKE ?", "%#{search[:title] || ''}%")
.where("country_translations.created_at > ?", search[:created_at_gt] || Time.now)
.where("country_translations.created_at < ?", search[:created_at_lt] || Time.now)
,也可以分成有需要時僅應用於三個濾這樣的:
query = Model.all
query = query.where("country_translations.title ILIKE ?", "%#{search[:title]}%") if search[:title]
query = query.where("country_translations.created_at > ?", search[:created_at_gt]) if search[:created_at_gt]
query = query.where("country_translations.created_at < ?", search[:created_at_lt]) if search[:created_at_lt]
# query now is filtered only with present filters.
最後的選擇上不僅過濾命中分貝多次,但負載data..it'all'第一的理念輸了,然後逐漸過濾它在以前數據是沒有意義的加載,因爲它無論如何被覆蓋...設置默認值肯定是一個不錯的選擇 –
@ Md.FarhanMemon居然沒有。在您讀取結果之前,它不會觸及數據庫。如果您在控制檯中運行它,它將**運行許多SQL命令,因爲控制檯正嘗試在每一行上打印結果。但是,當在腳本中運行時,.where命令會積累並創建一個SQL查詢以在需要時執行。 –