将SQL转换为Arel或Squeel



tl;dr

如何将下面的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结束;dr----

我正在做一个小型web项目,它的目标是获取我们的客户崩溃报告(当我们的桌面应用程序崩溃时,我们会向服务器发送诊断信息),对其进行分析,然后显示导致我们的应用程序崩溃的最常见错误。。因此,我们集中精力修复影响我们大部分用户的错误。。

我有两张桌子:

  1. crash_infos-id,md5(stacktrace.in.net堆栈的md5和异常消息有时会被.net翻译成用户的母语!所以我基本上清除了异常,通过删除特定语言的部分并从中生成md5)

  2. crash-id、user_guid(用户id)、crash_info_id(crash_infos表的id)

现在的问题是,我想创建一个查询,显示唯一用户最常见的崩溃(避免对同一用户计算多次相同的崩溃),并按崩溃次数进行排序。不幸的是,我对Arel(或者轨道上的红宝石)了解不够,所以我最终得到了原始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')

我该如何将其转换为更"讽刺"的内容?

提前感谢

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

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

相关内容

  • 没有找到相关文章

最新更新