0

tl;博士

如何将以下 SQL 转换为 Arel(或 Rails 中被视为标准的任何内容)

@toplist = ActiveRecord::Base.connection.execute(
     'select ci.crash_info_id,
        count(distinct(user_guid))[Occurences], 
        c.md5 
      from crashes ci 
        join crash_infos c on c.id=crash_info_id 
      group by ci.crash_info_id
      order by [Occurences] desc')

--- tl 结束;博士 ----

我正在开发一个小型 Web 项目,其目标是获取我们的客户崩溃报告(当我们的桌面应用程序崩溃时,我们将诊断信息发送到我们的服务器),分析它们,然后显示导致我们的应用程序崩溃的最常见错误是什么崩溃..这样我们就专注于修复影响我们大部分用户的错误..

我有 2 张桌子:

  1. crash_infos - id, md5(堆栈跟踪的 md5。在 .net 堆栈跟踪中,异常消息有时由 .net 翻译成用户的母语!所以我基本上通过删除语言特定部分并从中生成 md5 来清理异常)

  2. 崩溃 - id、user_guid(用户 id)、crash_info_id(id 到 crash_infos 表)

现在的问题是,我想做一个查询,显示唯一用户最常见的崩溃(避免为同一用户计算多次相同的崩溃)并按崩溃次数对其进行排序。不幸的是,我对 Arel 了解的不够多(或者任何关于 Rails 的 ruby​​ 方法),所以我最终得到了原始 SQL :(

@toplist = ActiveRecord::Base.connection.execute(
  'select ci.crash_info_id,
     count(distinct(user_guid))[Occurences], 
     c.md5 
   from crashes ci 
   join crash_infos c on c.id=crash_info_id 
   group by ci.crash_info_id 
   order by [Occurences] desc')

我怎样才能将它转换为更“railsy”的东西?

先感谢您

4

1 回答 1

2

不确定这是否真的更好,但至少你应该有一个独立于数据库的查询......

crashes     = Arel::Table.new(:crashes)
crash_infos = Arel::Table.new(:crash_infos)

crashes.
    project(crashes[:crash_info_id], crash_infos[:md5], Arel::Nodes::Count.new([crashes[:user_guid]], true, "occurences")).
    join(crash_infos).on(crashes[:crash_info_id].eq(crash_infos[:id])).
    group(crashes[:crash_info_id]).
    order("occurences DESC").
    to_sql

给出:

SELECT "crashes"."crash_info_id", "crash_infos"."md5", COUNT(DISTINCT "crashes"."user_guid") AS occurences FROM "crashes" INNER JOIN "crash_infos" ON "crashes"."crash_info_id" = "crash_infos"."id" GROUP BY "crashes"."crash_info_id" ORDER BY occurences DESC
于 2012-12-08T17:08:38.783 回答