[英]MySQL / Rails - Dynamically query a table field based on an attribute of each record
我有一個用例,需要根據Appointment
記錄的created_at
或start_on
值查詢Appointment
記錄。 約會有兩種類型: 'Estimate'和'GLA(go look at)' ,由值為0和1的type
字段表示。
如果約會的類型為Estimate,則查詢需要使用start_on
字段;如果約會為GLA,則查詢需要使用created_at
字段,因為GLA尚未安排,並且沒有start_on值。
現在,我正在使用Rails范圍查詢數據,以篩選出從最后一個約會開始到某個日期的屬性,如下所示(以下顯示“ from”):
scope :last_appointment_from, ->(date, type) {
query = joins(:appointments)
query = query.where('appointments.start_on = (
SELECT MAX(appointments.start_on)
FROM appointments
WHERE appointments.property_id = properties.id)')
query = query.where('appointments.start_on >= ?', date)
query
}
但這僅查詢start_on
值。
我已經嘗試着研究GREATEST(MAX(start_on),MAX(created_at))-但是后來我不確定如何知道在where('events.start_on >= ?', date)
部分。
輸入完此內容后,我想到了另一個可能的解決方法-僅創建另一個數據庫字段,該字段將根據活動記錄回調上的相應日期進行更新,該類型取決於約會的類型,稱為query_field
或類似內容(並運行腳本來設置所有現有記錄的值),這樣我就可以查詢該字段了?
任何想法/幫助將不勝感激!
由於您已經具有類型字段,因此它可能是STI的用例,即該模型的SQL模式相同,但在ruby方面的行為不同。
請注意,“類型”字段可能已經引起了您可能沒有考慮過的導軌問題,因為該字段通常是專門為導軌中的單表繼承STI保留的。
如果使用STI,則只需編寫一個訪問器即可從數據庫中提取正確的字段,並為每個模型提供該字段。
我認為這種方法應該起作用,除非除非約會是GLA
否則任何約會都必須在其start_on
之前不包含created_at
scope :last_appointment_from, ->(date, type) {
query = joins(:appointments)
query = query.where('GREATEST(appointments.start_on, appointments.created_at) = (
SELECT GREATEST(MAX(start_on), MAX(created_at))
FROM appointments
WHERE appointments.property_id = properties.id)')
query = query.where('GREATEST(appointments.start_on, appointments.created_at) >= ?', date)
query
}
我對Rails不太滿意,但是對於純MySQL,可以使用如下所示的位置:
WHERE ( (appointments.created_at > date AND appointments.type = 1) OR (appointments.start_on > date AND appointments.type = 0) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.