mysql - 如何在 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)
这是一个语法错误。
解决方案
这有点骇人听闻,但以下工作。
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])
. (未经测试)
推荐阅读
- php - 当提交 NULL 值时,laravel 雄辩的查询没有给出正确的结果
- zapier - “得到一个缺少“id”属性的结果” - Zapier
- .htaccess - .htaccess 在 url 中隐藏子目录
- python - Pandas/Numpy 根据存在将行移入列
- python - 我如何订阅消费者并通知他 Django 频道的任何变化
- c# - 从选定的列表 ID 显示视图中的类
- docker - 如何模拟/存根 websocket 请求离开 docker 容器
- angular - 将 ngFor 的每个元素都包装在新容器中?
- windows - 如何让windows的runas.exe在没有提示的情况下从凭证管理器获取密码?
- java - 如何解决 NoClassDefFoundError?