2013-02-14 57 views
0

如何僅使用Arel函數編寫以下SQL查詢?使用Arel進行無表選擇

select array_to_string(array(select name from tags, taggings where tags.id=taggings.id), ', ') 

警告:這是被認爲是一個更大的相關子查詢的一部分的SQL片段 - 它可能沒有意義在隔離。

回答

0

Arel(至少3-0穩定)沒有對命名函數的最大支持,所以它看起來很醜。以下代碼使用連接生成版本

tags_tbl = Arel::Table.new("tags") 
taggings_tbl = Arel::Table.new("taggings") 
arel = Arel::Nodes::NamedFunction.new(:array_to_string, [ 
    Arel::Nodes::NamedFunction.new(:array, [ 
    Arel.sql(
     tags_tbl.project(
     tags_tbl[:name] 
    ).join(
     taggings_tbl 
    ).on(
     tags_tbl[:id].eq(taggings_tbl[:id]) 
    ).to_sql 
    ) 
    ]) 
]) 
arel.to_sql # => array_to_string(array(SELECT "tags"."name" FROM "tags" INNER JOIN "taggings" ON "tags"."id" = "taggings"."id"))