Rails — построение условного оператора

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я пытаюсь создать свои условия следующим образом:

 conditions = {}
conditions[:doors] = 4
conditions[:type] = "sedan"

Cars.find(:all, :conditions=>conditions)
  

Как бы я добавил к своим условиям условия «LIKE»:

 conditions[:color] NOT LIKE '%black%'
  

Ответ №1:

Если у вас Rails 3 , рассмотрите возможность использования нового синтаксиса AREL для некоторых ваших запросов:

 records = Car.where(:doors => 4, :type => "sedan")
records = records.where("color NOT LIKE ?", "%black%")
  

Но если вы все еще используете Rails 2.3, то синтаксис выглядит следующим образом:

 clauses = ["doors = ?", "type = ?"]
conditions = [4, 'sedan']

if some_reason
  clauses << "color NOT LIKE ?"
  conditions << "%robert%"
end



Cars.find(:all, :conditions => [clauses.join(" AND" ), *conditions])
  

Определенно более раздражающий, чем синтаксис AREL.

Побочным преимуществом этого синтаксиса является то, что когда ActiveRecord заменяет ? , он очищает входные данные для SQL-инъекции.