PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Schienen dynamisch wo SQL-Abfrage

Ihr Ansatz ist ein wenig daneben, da Sie versuchen, das falsche Problem zu lösen. Sie versuchen, eine Zeichenfolge zu erstellen, die ActiveRecord übergeben werden kann, damit es eine Abfrage erstellen kann, wenn Sie einfach nur versuchen sollten, eine Abfrage zu erstellen.

Wenn Sie etwas sagen wie:

Model.where('a and b')

das ist dasselbe wie zu sagen:

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

und Sie können sagen:

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

statt:

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

Kombinieren Sie diese beiden Ideen mit Ihren self.instance_values Sie könnten so etwas bekommen wie:

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

oder sogar:

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

Diese setzen voraus, dass Sie alle Ihre Instanzvariablen ordnungsgemäß auf die Whitelist gesetzt haben. Wenn nicht, sollten Sie es tun.