簡體   English   中英

MySQL / Rails-根據每個記錄的屬性動態查詢表字段

[英]MySQL / Rails - Dynamically query a table field based on an attribute of each record

我有一個用例,需要根據Appointment記錄的created_atstart_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM