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

rails dinamico dove query sql

Il tuo approccio è un po' sbagliato perché stai cercando di risolvere il problema sbagliato. Stai cercando di creare una stringa da consegnare ad ActiveRecord in modo che possa creare una query quando dovresti semplicemente provare a creare una query.

Quando dici qualcosa come:

Model.where('a and b')

è come dire:

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

e puoi dire:

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

invece di:

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

Combinando queste due idee con i tuoi self.instance_values potresti ottenere qualcosa come:

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

o anche:

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

Quelli presuppongono che tu abbia inserito correttamente nella whitelist tutte le variabili di istanza. Se non l'hai fatto, dovresti.