Конкатенат (клей), где условия OR или AND (Arel, Rails3)

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

Например:

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

Мне хотелось бы что-то вроде

 where3=where1.or where2 

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

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

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

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

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

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

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

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

docs: https://github.com/rails/arel

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

 t = User.arel_table User.where(t[:name].eq('bob').or(t[:age].lt(25))) 

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

 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'"