sql >> Databasteknik >  >> RDS >> PostgreSQL

rails dynamisk där sql-fråga

Ditt tillvägagångssätt är lite fel eftersom du försöker lösa fel problem. Du försöker bygga en sträng som ska lämnas till ActiveRecord så att den kan skapa en fråga när du helt enkelt skulle försöka bygga en fråga.

När du säger något som:

Model.where('a and b')

det är samma sak som att säga:

Model.where('a').where('b')

och du kan säga:

Model.where('c like ?', pattern)

istället för:

Model.where("c like '#{pattern}'")

Att kombinera dessa två idéer med dina self.instance_values du kan få något som:

def query
  self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
    q.where("#{name} like ?", "%#{value}%")
  end
end

eller till och med:

def query
  empties      = ->(_, v) { v.blank? }
  add_to_query = ->(q, (n, v)) { q.where("#{n} like ?", "%#{v}%") }
  instance_values.reject(&empties)
                 .inject(YourModel, &add_to_query)
end

De antar att du har vitlistat alla dina instansvariabler korrekt. Om du inte har gjort det borde du göra det.




  1. Kan inte köra något från mysql-utilities:Ingen modul med namnet mysql.utilities.common.tools

  2. SQL- Välj den mest liknande produkten

  3. Hur hittar man saknade rader (datum) i en mysql-tabell?

  4. Hur man hämtar datumet från en Datetime-kolumn i MySQL