2012-02-16 2 views
8

ARelCONCAT() 및 기타 SQL 함수에 열 이름 (살균 됨, 별명이있을 수 있음 등)을 작성하는 방법이 있습니까?AREL에서 CONCAT() 등의 함수를 어떻게 사용합니까?

여기

?> 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 모든 행에서 동일 할 것이라는 점을 알고있다) ... how to do it with AVG()입니다 ?

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

+0

나는 이것에 대해 좀 더 자세히 설명했다.

답변

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)') –

+5

@AaronPatterson 코드를 사용하여'func.to_sql'은'zomg ('countries', 'name')'을 제공합니다. 내 생각에, 코드는'... Function.new 'zomg', [name]'(대괄호로 묶음)이어야한다. – RocketR