如何仅使用 Arel 函数编写以下 SQL 查询?
select array_to_string(array(select name from tags, taggings where tags.id=taggings.id), ', ')
警告:这是一个 SQL 片段,它应该是更大的相关子查询的一部分 - 孤立它可能没有意义。
如何仅使用 Arel 函数编写以下 SQL 查询?
select array_to_string(array(select name from tags, taggings where tags.id=taggings.id), ', ')
警告:这是一个 SQL 片段,它应该是更大的相关子查询的一部分 - 孤立它可能没有意义。
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"))