Как использовать такие функции, как CONCAT () и т. Д. В ARel? - PullRequest
8 голосов
/ 16 февраля 2012

Есть ли способ ARel записывать (очищенные, возможно, псевдонимы и т. Д.) Имен столбцов в CONCAT() и другие функции SQL?

Вот как это сделать с 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`"

(да, я знаю, что avg_id будет одинаковым в каждом ряду, просто пытаюсь проиллюстрировать мой вопрос)

Так что, если я хочу другую функцию?

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

Спасибо!

1 Ответ

12 голосов
/ 16 февраля 2012

Использование NamedFunction:

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