給定表concerts
和Array
類型的列concerts.occurence_dates
。 我需要選擇使用ActiveRecord在from_date
和to_date
內發生的音樂會。在Postgres日期範圍內選擇記錄
我只是想出瞭如何from_date
後選擇的事件:
Concert.where(':from_date < ANY(occurrence_dates)', from_date: from_date)
給定表concerts
和Array
類型的列concerts.occurence_dates
。 我需要選擇使用ActiveRecord在from_date
和to_date
內發生的音樂會。在Postgres日期範圍內選擇記錄
我只是想出瞭如何from_date
後選擇的事件:
Concert.where(':from_date < ANY(occurrence_dates)', from_date: from_date)
可能的解決辦法:
Concert.where('(occurrence_dates[0], occurrence_dates[array_length(occurrence_dates, 1)]) OVERLAPS (:from_date, :to_date)', from_date: from_date, to_date: to_date)
由於mentioned in the official documentation
數組不是集合;搜索特定的數組元素可能是數據庫錯誤設計的標誌。考慮使用一個單獨的表,每行包含一個數組元素。這將更容易搜索,並且可能對大量元素更好地擴展。
這也適用於您的情況,試圖使用特定的數組元素執行搜索。
您正在使用錯誤的字段。您真正需要使用的是兩個單獨的列,一個用於from_date
,另一個用於to_date
以及兩個索引。
的指標將確保快速查找,單獨列將允許你搜索傳遞日期的範圍,或者乾脆利用
Concert.where('from_date >= ? AND to_date <= ?', from_date, to_date)
隨着當前的設置,你最好的解決方案是掃描所有的記錄,選擇每個occurrence_dates
並檢查它們是否符合您的標準。
什麼,如果我不是一個數據庫所有者,並將它作爲遺產? – yurko