使用Arel进行无表选择

时间:2013-02-14 14:08:45

标签: arel

如何仅使用Arel函数编写以下SQL查询?

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

警告:这是一个SQL片段,应该是更大的相关子查询的一部分 - 它可能没有意义。

1 个答案:

答案 0 :(得分:0)

Arel(至少3-0-stable)对命名函数没有最大的支持,所以它看起来很难看。下面的代码使用连接

生成版本
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"))