Necesito escribir una consulta, usando Arel o ActiveRecord, en Rails 5, usando intersecciones y uniones. Cada respuesta sobre SO que he encontrado hasta ahora sobre esto generalmente parece implicar la transformación del ejemplo particular que da el OP en otro tipo de consulta. Esto no funcionará para mí, ya que estas consultas se componen mediante programación y, con mucho, la forma más sensata de hacerlo es como subconsultas que luego se unen con INTERSECT y UNION.
Intersección con & y unión con | funciona totalmente y hace lo que quiero que haga, pero ambos devuelven matrices y, por lo tanto, traerán un enorme, enorme, enorme conjunto de datos a la memoria sin una buena razón.
MyModel.where(...).intersect(MyModel.where(...)) Este tipo de obras, pero el resultado es un Arel::Nodes::Intersect en lugar de un ActiveRecord::Relation , que no es tan útil. Intenté crearlos usando Arel directamente, pero me frustró la falta de documentación de Arel.
¿Hay una forma más Railsy de lograr esto que todavía se pueda encadenar (es decir, todavía se puede paginar perezosamente como una AR::Relation)?
Para INTERSECT, solo usa:
MyModel.where(...).where(...)o puede ser una sintaxis más agradable ponerlo en varias líneas así:
MyModel\ .where(...) .where(...) También puede usar where(nil), no tendrá efecto en la relación. Esto es útil cuando está construyendo programáticamente las condiciones where (por ejemplo where({a: a_val} if a_val.present? ).
Para UNION, use Rails 5 or :
MyModel.where(...).or(MyModel.where(...))o con sintaxis multilínea:
MyModel\ .where(...) .or( MyModel\ .where(...) )