Ruby on rails 如何以Ruby的方式编写这个MySQL查询?

Ruby on rails 如何以Ruby的方式编写这个MySQL查询?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个正在工作的MySQL查询,当我在ActiveRecord::Base.connection.execute中传递它时,它将返回所需的值。我想知道如何以更Ruby优化的方式编写它 我的质询如下: 选择SUMinvoiceAmt作为invoiceTotal, 季度发票日期,年度发票日期, 从发票 按年份分组发票日期、季度发票日期 按年份发票日期、季度发票日期排序 假设您有一个名为Invoice的ActiveRecord模型,那么以下内容应该可以满足您的需要: 发票。选择“SUMinvoice

我有一个正在工作的MySQL查询,当我在ActiveRecord::Base.connection.execute中传递它时,它将返回所需的值。我想知道如何以更Ruby优化的方式编写它

我的质询如下:

选择SUMinvoiceAmt作为invoiceTotal, 季度发票日期,年度发票日期, 从发票 按年份分组发票日期、季度发票日期 按年份发票日期、季度发票日期排序 假设您有一个名为Invoice的ActiveRecord模型,那么以下内容应该可以满足您的需要:

发票。选择“SUMinvoiceAmt作为发票总额,QUARTERinvoiceDate作为q,YEARinvoiceDate作为y” .订单'y,q' .y组,q组 请注意,我尚未测试该查询。这里的想法是,您可以将经过验证的查询段传递给select、order和group。我使用命名别名来简化订单和组段。

如果没有发票的ActiveRecord模型,可以使用。ActiveRecord在引擎盖下使用Arel,因此Rails已经包含了它

invoices = Arel::Table.new(:invoices)
q = Arel::Nodes.build_quoted('Q')
open_paren = Arel::Nodes.build_quoted('(')
close_paren = Arel::Nodes.build_quoted(')')

quarter = Arel::Nodes::NamedFunction.new('QUARTER', [invoices[:invoiceDate]])
year = Arel::Nodes::NamedFunction.new('YEAR', [invoices[:invoiceDate]])

concatenated = Arel::Nodes::NamedFunction.new('concat', [q, quarter, open_paren, year, close_paren])
query = invoices.
  project(invoices[:invoiceAmt].sum.as('invoiceTotal'), concatenated).
  group(quarter, year).
  order(quarter, year)

puts query.to_sql

# SELECT SUM("invoices"."invoiceAmt") AS invoiceTotal, concat('Q', QUARTER("invoices"."invoiceDate"), '(', YEAR("invoices"."invoiceDate"), ')')
# FROM "invoices"
# GROUP BY QUARTER("invoices"."invoiceDate"), YEAR("invoices"."invoiceDate")
# ORDER BY QUARTER("invoices"."invoiceDate"), YEAR("invoices"."invoiceDate")

您真的想在数据库级别执行字符串连接,还是只需返回正确的行并在应用程序代码中执行字符串格式设置就足够了?@vijoc我只想使用ruby获得正确的行。我可以稍后格式化数据。我以前也做过类似的操作,但它也会返回“customerId”,这也是发票表中的一列,我不希望返回null。@NiladriSekharBasu您是说您也希望选择customerId,即不将其设为null,而是其他内容?不,我不想要customerId。它也没有写在您编写的查询中,那么它为什么会被返回?问题是,它既没有被查询也没有被返回,这就是为什么它是空的。我假设您在发票模型中看到它,它将列出customerId属性,即使它没有值。为什么只返回customerId?为什么我没有提到像customerId这样的其他字段呢?此外,我使用返回值来呈现JSON输出。有什么想法吗?我怎样才能把它做好?它需要格式化还是其他什么?idk,也许我的Arel已经过时了,但是试图在这个查询中使用SCUTLE,我最终修复了它的输出,而不是保留了它