2012-02-16 20 views
8

有沒有辦法讓ARelCONCAT()和其他SQL函數寫入(消毒,可能是別名等)列名?如何在ARel中使用CONCAT()等函數?

這裏的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`" 

(是的,我知道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`" 

謝謝!

+0

續集有選擇的列'「......」 lit'意爲‘SQL文本’,而不是被解釋爲這樣的情況下字符串的方式。這將禁用SQL轉義,所以你可以注入任何你想要的。不確定AREL是什麼,但也許這是一個想法。 – tadman 2012-02-16 04:32:48

+0

我已經在這裏自己寫了一些更詳細的信息 2012-03-07 22:41:13

回答

12

使用NamedFunction

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

它看起來像NamedFunction需要附加到屬性?例如如果我想按日期對事物進行分組,我可以做'.group(arel_table [:created_at] .date)',而不在「created_at」上直接附加「date」函數,這樣我就可以在別處重用它了嗎? (sql:'GROUP BY DATE(created_at)') – 2012-04-05 02:38:38

+5

@AaronPatterson使用你的代碼,'func.to_sql'給出'zomg('countries','name')'。我認爲,代碼應該是'... Function.new'zomg',[name]'(帶方括號)。 – RocketR 2012-11-15 22:29:31