2012-02-16 12 views
8

CONCAT() ve diğer SQL işlevleri içine ARel yazma (sanitized, muhtemelen aliased, vb) sütun adları sahip bir yolu var mı?ARel'de CONCAT() vb. Gibi işlevleri nasıl kullanırım?

İşte

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

Ben farklı bir işlevi isteseydi Peki

(evet, sadece sorumu göstermek için çalışıyor, avg_id her satırda aynı olacağını biliyorum) ... how to do it with AVG() var ?

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

Teşekkürler!

+0

devamı lit' 'literal SQL' anlamına gelen "..." 'olarak sütunlarını seçerek yerine bu gibi durumlar için bir dize olarak yorumlanır olmanın bir yolu vardır. SQL kaçışını devre dışı bırakır, böylece ne istersen enjekte edebilirsin. AREL eşdeğerinin ne olduğundan emin değiliz, ama belki de bu bir fikir. – tadman

+0

Burada kendime biraz daha ayrıntılı yazı yazdım

cevap

12

Kullanım NamedFunction.

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

Bir özelliğe NamedFunction'un eklenmesi gerekiyor mu? Örneğin. Bir şeyleri tarihe göre gruplandırmak istesem, "group" işlevini doğrudan "created_at" üzerine eklemeden ".group (arel_table [: created_at] .date)' ı, başka bir yerde yeniden kullanabilir miyim? (sql: 'DATE BY GROUP (created_at)') –

+5

@AaronPatterson Kodunuzu kullanarak 'func.to_sql' zomg ('country', 'name')' verir. Bence, kod '' Function.new 'zomg', [name] '(köşeli parantez ile) olmalıdır. – RocketR