2012-02-16 10 views
8

C'è un modo per avere i nomi delle colonne ARel di scrittura (sanificati, eventualmente con aliasing, ecc.) In CONCAT() e altre funzioni SQL?Come utilizzare funzioni come CONCAT(), ecc. In ARel?

Ecco how to do it with AVG() ...

?> name = Arel::Attribute.new(Arel::Table.new(:countries), :name) 
=> #<struct Arel::Attributes::Attribute [...] 
?> population = Arel::Attribute.new(Arel::Table.new(:countries), :population) 
=> #<struct Arel::Attributes::Attribute [...] 
?> Country.select([name, population.average]).to_sql 
=> "SELECT `countries`.`name`, AVG(`countries`.`population`) AS avg_id FROM `countries`" 

(sì, lo so che avg_id sarebbe lo stesso in ogni riga, solo cercando di illustrare la mia domanda)

Quindi cosa se volevo una funzione diversa ?

?> Country.select(xyz).to_sql # Arel::Concat.new(name, population) or something? 
=> "SELECT CONCAT(`countries`.`name`, ' ', `countries`.`population`) AS concat_id FROM `countries`" 

Grazie!

+0

Sequel ha un modo di selezione di colonne come ' "..." significa lit' 'SQL letterale' invece di essere interpretato come una stringa per situazioni come questo.. Questo disabilita l'escape di SQL in modo da poter iniettare quello che vuoi. Non sei sicuro di quale sia l'equivalente di AREL, ma forse è un'idea. – tadman

+0

Ho scritto un po 'più di dettaglio su questo me stesso qui

risposta

12

Uso NamedFunction:

name = Arel::Attribute.new(Arel::Table.new(:countries), :name) 
func = Arel::Nodes::NamedFunction.new 'zomg', [name] 
Country.select([name, func]).to_sql 
+1

Sembra che NamedFunction debba essere collegato a un attributo? per esempio. se voglio raggruppare le cose in base alle date, potrei fare '.group (arel_table [: created_at] .date)', senza associare la funzione "date" direttamente su "created_at" in modo da poterla riutilizzare altrove? (sql: 'GROUP BY DATE (created_at)') –

+5

@AaronPatterson Usando il tuo codice, 'func.to_sql' restituisce' zomg ('countries', 'name') '. Penso che il codice dovrebbe essere '... Function.new 'zomg', [name]' (con parentesi quadre). – RocketR

Problemi correlati