PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

rails dinâmico onde consulta sql


Sua abordagem está um pouco errada, pois você está tentando resolver o problema errado. Você está tentando construir uma string para entregar ao ActiveRecord para que ele possa construir uma consulta quando você deveria simplesmente tentar construir uma consulta.

Quando você diz algo como:
Model.where('a and b')

é o mesmo que dizer:
Model.where('a').where('b')

e você pode dizer:
Model.where('c like ?', pattern)

ao invés de:
Model.where("c like '#{pattern}'")

Combinando essas duas ideias com seus self.instance_values você poderia obter algo como:
def query
  self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
    q.where("#{name} like ?", "%#{value}%")
  end
end

ou ainda:
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

Eles assumem que você colocou corretamente todas as suas variáveis ​​de instância na lista de permissões. Se você não tiver, então você deve.