2012-02-16 18 views
8

Czy istnieje sposób na zapisanie (oczyszczonych, ewentualnie aliasowanych itp.) Nazw kolumn na CONCAT() i innych funkcji SQL?Jak korzystać z funkcji takich jak CONCAT() itp. W AREL?

Oto 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`" 

(tak, wiem, że avg_id byłaby taka sama w każdym rzędzie, po prostu staramy się zilustrować moje pytanie)

Więc co, jeśli chciałem inną funkcję ?

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

Dzięki!

+0

Sequel ma sposób wybierając kolumny jako '„...”lit' czyli«dosłownego»SQL zamiast być interpretowany jako ciąg dla tego typu sytuacjach.. Dzięki temu można wyłączyć przechodzenie SQL, aby można było wstrzykiwać, co tylko chcesz. Nie jestem pewien, co to jest odpowiednik AREL, ale może to jest pomysł. – tadman

+0

Napisałem trochę więcej szczegółów na ten temat tutaj

Odpowiedz

12

Zastosowanie NamedFunction:

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

Wygląda na to, że NamedFunction musi być dołączony do atrybutu? na przykład jeśli chcę pogrupować rzeczy według dat, czy mogę zrobić '.group (arel_table [: created_at] .date)', bez dołączania funkcji "date" bezpośrednio na "created_at", aby móc ponownie użyć go gdzie indziej? (sql: 'GROUP BY DATE (created_at)') –

+5

@AaronPatterson Używając twojego kodu, 'func.to_sql' podaje' zomg ('countries', 'name') '. Myślę, że kod powinien być "... Function.new" zomg ", [name]' (z nawiasami kwadratowymi). – RocketR

Powiązane problemy