【问题标题】:How to use Arel::Nodes::NamedFunction to define GROUP_CONCAT with SEPARATOR option如何使用 Arel::Nodes::NamedFunction 定义带有 SEPARATOR 选项的 GROUP_CONCAT
【发布时间】:2019-08-22 16:29:54
【问题描述】:

我为 MariaDB 的 GROUP_CONCAT 定义了一个命名的 Arel 函数

ta = Arel::Table.new 'authors'

Arel::Nodes::NamedFunction.new( 'GROUP_CONCAT',  [ta[:name]] ).to_sql

这会生成:

"GROUP_CONCAT(`authors`.`name`)"

我喜欢定义分隔符选项以生成以下输出:

"GROUP_CONCAT(`authors`.`name` SEPARATOR '|' )"

我尝试了很多方法,例如

Arel::Nodes::NamedFunction.new( 'GROUP_CONCAT',  [ ta[:name]], "SEPERATOR |"  ).to_sql

不起作用,因为它创建了以下 SQL sn-p:

GROUP_CONCAT(`authors`.`name`) AS SEPERATOR '|'

我需要如何指定所需输出的参数?

非常感谢:)

【问题讨论】:

    标签: ruby arel


    【解决方案1】:

    你几乎拥有它。所有参数都进入数组(第二个参数)。 AFAIK,Arel 一直被认为是私有 API,因此文档非常少。

    (https://github.com/rails/rails/blob/354f1c28e81d9846fb9e5346fcca50cf303c12c1/activerecord/lib/arel/nodes/named_function.rb)

    Arel::Nodes::NamedFunction.new('GROUP_CONCAT', [ta[:name], Arel.sql("SEPARATOR '|'")]).to_sql
    

    【讨论】:

    • 只有代码的答案通常被认为是低质量的。您能否为您的答案添加解释。
    • 请解释您的答案并解释为什么它按 OP 需要的方式工作。
    • 非常感谢@firien。当然,SQL 函数参数都需要在一个参数中传递,因为第三个参数是根据定义的别名。假设您可以将其添加到您的答案Arel::Nodes::NamedFunction#new(name, expr, aliaz = nil)
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2014-06-24
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多