0

Je cet extrait de ActiveRecord:Exprimer un CTE en utilisant Arel

scope = Listing.where(Listing.arel_table[:price].gt(6_000_000)) 

Le sql résultant:

SELECT listings.* FROM listings where listings.price > 6000000 

Je voudrais ajouter un CTE qui entraînerait cette sql:

WITH lookup AS (
    SELECT the_geom FROM lookup WHERE slug = 'foo-bar' 
) 

SELECT * from listings, lookup 
WHERE listings.price > 6000000 
AND ST_within(listings.the_geom, lookup.the_geom) 

Je voudrais exprimer ce sql inclus du CTE en utilisant Arel et ActiveRecord.

Je voudrais également utiliser la variable scope comme point de départ.

Répondre

0

Vous pouvez créer le CTE comme:

lookup = Arel::Table.new(:lookup) # Lookup.arel_table 
cte = Arel::Nodes::As.new(lookup, 
    lookup.where(lookup[:slug].eq('foo-bar')).project('the_geom')) 

puis l'utiliser avec votre champ comme:

scope.with(cte) 

Vous pouvez voir un exemple pour cela dans le Arel README, au bas

+0

En essayant cela, il en résulte un 'from' manquant. c'est à dire. juste 'SELECT * FROM listes WHERE' pas' SELECT * FROM listes, recherche WHERE' –

+0

Cela fonctionne en ajoutant un 'joint':' scope.joins ('CROSS JOIN lookup'). avec (cte) ' –