sql >> Database teknologi >  >> RDS >> PostgreSQL

rails dynamisk hvor sql forespørgsel

Din tilgang er lidt forkert, da du prøver at løse det forkerte problem. Du forsøger at bygge en streng, der skal afleveres til ActiveRecord, så den kan bygge en forespørgsel, når du blot skulle prøve at bygge en forespørgsel.

Når du siger noget som:

Model.where('a and b')

det er det samme som at sige:

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

og du kan sige:

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

i stedet for:

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

At kombinere disse to ideer med dine self.instance_values du kunne få noget som:

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

eller endda:

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 antager, at du har hvidlistet alle dine instansvariabler korrekt. Hvis du ikke har, så skal du.




  1. pymysql-forbindelse vælg forespørgsel og hent tilbage tuple, der har byte-literals som b'25.00' i stedet for strenge som '25.00'

  2. Brug af Intel Optane Storage til SQL Server

  3. Sådan indsætter du data fra en kolonne i en anden tabel

  4. Sådan bestemmes om tallet er flydende eller heltal