/var/log/messages

Jan 5, 2014 - 2 minute read - Comments - rails

自分メモ (集計)

ええと、以下な構成のアンケート回答なクラスがあって

> SecurityQ
=> SecurityQ(id: integer, part: string, rating: string, created_at: datetime, updated_at: datetime)

part 毎に五つ程度の回答カテゴリがある、が前提ってことで集計するための AR なメソドが以下になる模様。

> SecurityQ.where(["part = '0'"]).group(:rating).order('count_rating desc').count('rating')
=> {"4"=>2, "0"=>1, "1"=>2}

とは言えこれってどこかの時点でクエリだと駄目になるはずですね。

とは言えこれって例えば上の例だと存在してる part 毎に rating のソレが欲しいよね、みたいな事になるのは目に見えているので先にそのリストを取得しときたいよね、ということで以下なソレが前提になってくるのかどうか。

> SecurityQ.select(:part).group(:part).order(:part)
=> [#<SecurityQ part: "0">, #<SecurityQ part: "1">, #<SecurityQ part: "2">, #<SecurityQ part: "3">, #<SecurityQ part: "4">]

あるいは取り出し方てきには以下?

> SecurityQ.select(:part).group(:part).order(:part)[0][:part]
=> "0"

rating 毎の順位?

実は名前ベースの情報である観点での rating を云々する、という話もあったりなんかしておりまして、以下を参考にしつつ作戦を練ってみます。

例えば

> Hoge
=> Hoge(id: integer, hoge: string, rating: string)

みたいな (略してますが) ソレがあるとして

> Hoge.where(rating: "3").group(:hoge).order('count_hoge desc').count('hoge')
=> {"xxx"=>2, "yyy"=>1}

な形で何とかなるのかどうか。全部もらって上位何件かをフィルタして戻せば良いのかどうか。

実装

とりあえず rails g controller して確認してみることに。

空の controller を追加して微妙な routing を追加して controller に以下なメソドを追加してみました。

  def counting
    res = Hoge.where(rating: params[:rating]).group(:hoge).order('count_hoge desc').count('hoge')
    respond_to do |format|
      format.json { render json: res }
    end
  end

なんとなく期待しているナニが戻ってきている模様。