Объединить (склеить), где условия по ИЛИ или И (Arel, Rails3) - PullRequest
5 голосов
/ 06 ноября 2010

У меня есть несколько сложных запросов (с использованием подзапросов и т. Д.), И я хочу склеить их с помощью оператора OR или AND.

Например:

where1=table.where(...)
where2=table.where(...)

Я бы хотел что-то вроде

where3=where1.or where2

Следующий пример не работает для меня:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

, потому что у меня есть несколько запросов where (..), и я хочу объединить их .

Другими словами

У меня есть 3 метода: первый возврат первый где, второй-второй, третий - ИЛИ конкатенация.

Я должен иметь возможность использовать все 3 метода в моем приложении и сохранить DRY код

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010

Вы ищете форму:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

документы: https://github.com/rails/arel

1 голос
/ 24 августа 2011

users.where (users [: name] .eq ('bob'). Or (users [: age] .lt (25))) близко, но вам нужно получить arel_table, чтобы указать столбцы, например

t = User.arel_table
User.where(t[:name].eq('bob').or(t[:age].lt(25)))
0 голосов
/ 19 июля 2011

Я знаю, что для объединения И вы можете сделать:

users = User.where(:name => 'jack')
users = users.where(:job => 'developer')

и вы получите конкатенацию с AND в SQL (попробуйте с #to_sql в конце)

Помимо этого вы можете сделать:

where1=table.where(...)
where2=table.where(...)
where1 & where2

пример:

(User.where(:name => 'jack') & User.where(:job => 'dev')).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`name` = 'jack' AND `users`.`job` = 'dev'" 
...