首页 > 解决方案 > 如何在 Arel 中表达 MySql 函数 `GROUP_CONCAT(DISTINCT column)`?

问题描述

我可以用

Arel::Nodes::NamedFunction.new('GROUP_CONCAT', [an_arel_table[:a_column]])

生成

GROUP_CONCAT(a_column)

在我的SELECT声明中。但是如何添加DISTINCT选项?

Arel::Nodes::NamedFunction.new('GROUP_CONCAT', ['DISTINCT', an_arel_table[:a_column]])

产量

GROUP_CONCAT(DISTINCT, a_column)

这是一个语法错误。

标签: mysqlarel

解决方案


这有点骇人听闻,但以下工作。

Arel::Nodes::InfixOperation提供了一种生成序列的机制X DISTINCT Y。通过设置X为空白 ( Arel::Nodes::SqlLiteral.new('')),我们最终得到DISTINCT Y.

Arel::Nodes::NamedFunction.new('GROUP_CONCAT', [
  Arel::Nodes::InfixOperation.new('DISTINCT',
        Arel::Nodes::SqlLiteral.new(''),
        an_arel_table[:a_column]])])

更高版本的 Arel(Rails 4.2 之后)支持UnaryOperation可能允许将修饰符DISTINCT表示为Arel::Nodes::UnaryOperation.new('DISTINCT', an_arel_table[:a_column]). (未经测试)


推荐阅读