PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

rails dynamique où requête sql

Votre approche est un peu décalée car vous essayez de résoudre le mauvais problème. Vous essayez de créer une chaîne à remettre à ActiveRecord afin qu'il puisse créer une requête alors que vous devriez simplement essayer de créer une requête.

Lorsque vous dites quelque chose comme :

Model.where('a and b')

cela revient à dire :

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

et vous pouvez dire :

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

au lieu de :

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

Combiner ces deux idées avec votre self.instance_values vous pourriez obtenir quelque chose comme :

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

ou encore :

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

Ceux-ci supposent que vous avez correctement mis en liste blanche toutes vos variables d'instance. Si ce n'est pas le cas, vous devriez.