2012-02-16 18 views
8

Có cách nào để có các tên cột ARel viết (đã được khử trùng, có thể được đặt tên, v.v.) thành CONCAT() và các hàm SQL khác không?Làm cách nào để sử dụng các hàm như CONCAT(), v.v ... trong AREL?

Dưới đây là 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`" 

(vâng, tôi biết rằng avg_id sẽ là như nhau trong mỗi hàng, chỉ cần cố gắng để minh họa cho câu hỏi của tôi)

Vì vậy, những gì nếu tôi muốn có một chức năng khác nhau ?

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

Cảm ơn!

+0

Sequel có một cách lựa chọn cột như ' "..." lit' có nghĩa là 'SQL đen' thay vì được hiểu như là một chuỗi cho những tình huống như thế này.. Điều đó vô hiệu hóa SQL thoát để bạn có thể tiêm bất cứ điều gì bạn muốn. Không chắc tương đương AREL là gì, nhưng có lẽ đó là một ý tưởng. – tadman

+0

Tôi đã viết chi tiết hơn một chút về điều này tại đây

Trả lời

12

Sử dụng NamedFunction:

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

Có vẻ như NamedFunction cần được đính kèm vào một thuộc tính? ví dụ. nếu tôi muốn nhóm mọi thứ theo ngày, tôi có thể làm '.group (arel_table [: created_at] .date)', mà không đính kèm hàm "date" trực tiếp vào "created_at" để tôi có thể tái sử dụng nó ở nơi khác? (sql: 'GROUP BY DATE (created_at)') –

+5

@AaronPatterson Sử dụng mã của bạn, 'func.to_sql' cho' zomg ('countries', 'name') '. Tôi nghĩ rằng, mã nên được '... Function.new 'zomg', [name]' (với dấu ngoặc vuông). – RocketR

Các vấn đề liên quan