0

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プロジェクトに取り組んでいます。目標は、顧客のクラッシュレポート(デスクトップアプリがクラッシュすると、サーバーに診断を送信します)を取得し、それらを分析して、アプリケーションの原因となる最も一般的なバグを表示することです。クラッシュ..そのため、ユーザーの最大のチャンクに影響を与えるバグの修正に集中します。

私は2つのテーブルを持っています:

  1. crack_infos --id、md5(.netのスタックトレースのmd5スタックトレースと例外メッセージは.netによってユーザーの母国語に変換されることがあります!したがって、言語固有の部分を削除してmd5を生成することにより、基本的に例外をサニタイズします)

  2. クラッシュ-id、user_guid(ユーザーID)、crash_info_id(idからcrash_infosテーブル)

ここで質問ですが、一意のユーザーの最も一般的なクラッシュを表示するクエリを作成し(同じユーザーの同じクラッシュを何度もカウントすることは避けてください)、クラッシュの数で並べ替えたいと思いました。残念ながら、私は十分なArel(またはRuby on Railsの方法)を知らなかったので、生の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')

これをもっと「レールのような」ものに変換するにはどうすればよいですか?

前もって感謝します

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 に答える