如何在Arel中表达MySql函数`GROUP_CONCAT(DISTINCT column)`?

时间:2018-11-29 15:10:00

标签: mysql arel

我可以使用

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)

这是语法错误。

1 个答案:

答案 0 :(得分:0)

有点骇人听闻,但以下方法可行。

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])。 (未测试)