условия рельсов на основе наличия атрибутов

Мне было интересно, есть ли лучший способ сделать это:

def conditions(obj)
  if self.setor.present?
    obj = obj.joins(:negocios_setores).where("setor_id = ?", self.setor.id)
  end

  if self.uf.present?
    obj = obj.joins(localizacao: [:uf]).where("uf_id = ?", self.uf_id)
  end

  if self.municipio.present?
    obj = obj.joins(localizacao: [:municipio]).where("municipio_id = ?", self.municipio_id)
  end

  if !self.lucro_liquido_min.to_f.zero?
    obj = obj.where("lucro_liquido_anual BETWEEN ? and ?", self.lucro_liquido_min, self.lucro_liquido_max)
  end

  if !self.faturamento_min.to_f.zero?
    obj = obj.where("faturamento_bruto_anual BETWEEN ? and ?", self.faturamento_min, self.faturamento_max)
  end

  if !self.valor_min.to_f.zero?
    obj = obj.where("valor BETWEEN ? and ?", self.valor_min, self.valor_max)
  end

  obj
end

Предоставляет ли rails 4 что-то, чтобы выполнить условие только в том случае, если значение присутствует, вместо того, чтобы помещать его со значением NULL?


person renatojf    schedule 24.02.2016    source источник


Ответы (1)


Я не верю, что есть способ сделать именно то, что вы упомянули. Я столкнулся с таким же типом объединения запросов.

Чтобы немного почистить и сделать это более плотным, вы можете использовать однострочные if и unless. Я думаю, что это немного чище и все еще читабельно.

def conditions(obj)  
  obj = obj.joins(:negocios_setores).where(setor: setor) if setor.present?
  obj = obj.joins(localizacao: [:uf]).where("uf_id = ?", uf_id) if uf.present?
  obj = obj.joins(localizacao: [:municipio]).where("municipio_id = ?", municipio_id) if municipio.present?
  obj = obj.where("lucro_liquido_anual BETWEEN ? and ?", lucro_liquido_min, lucro_liquido_max) unless lucro_liquido_min.to_f.zero?
  obj = obj.where("faturamento_bruto_anual BETWEEN ? and ?", faturamento_min, faturamento_max) unless faturamento_min.to_f.zero?
  obj = obj.where("valor BETWEEN ? and ?", valor_min, valor_max) unless valor_min.to_f.zero?
  obj
end

Я также изменил первый запрос, чтобы использовать запросы в стиле Rails, а не SQL в файле where.

person James Klein    schedule 24.02.2016
comment
Спасибо за вашу помощь! - person renatojf; 24.02.2016