2013-03-20 4 views
2

Я работаю с рельсами, и у меня есть этот sql-запрос, который я хотел бы использовать с isl.Запросы с Arel

"SELECT `people`.* FROM `peoples` WHERE `peoples`.`home_id` = 289 AND (`people`.`created_at` BETWEEN '2013-03-12' AND '2013-03-15' AND (`people`.`first_name` LIKE '%jane%' OR `people`.`email` LIKE '%jane%'))" 

Теперь я решил запрос с Arel, но я хотел бы избежать повторения «спички (»% # {Поиск}% «)» для атрибутов, которые должны соответствовать той же переменной поиска.

a.where(a.arel_table[:created_at].in(date_range).and(a.arel_table[:first_name].matches("%#{search}%").or(a.arel_table[:email].matches("%#{search}%")))) 

Что-то вроде:

a.where(a.arel_table[:created_at].in(date_range).and([:email, :first_name].each {|attr| or.(a.arel_table[:attr].matches("%#{search}%")))) 

Но это не работает.

ответ

2

Проблема заключалась в том, что условие выглядит как ((c1 или c2) или c3) или c4), но похоже, что концепция Ареля «или» является двоичной.

Таким образом, их невозможно определить как (c1 или c2 или c3 или c4).

Смежные вопросы