質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Ruby on Rails

    7718questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Highcharts

    39questions

    HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。

ransackでの抽出結果からHighchartsを使ってグラフを作成する良い方法?

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 609

seesaajira-

score 54

モデル
【game.rbbelongs_to :membermember.rbhas_many :games

データからransackで日付の期間を指定してデータを抽出します
名前はmemeberのnameを表示します

日付 名前 ・・・
3/1 AAA ・・・
3/2 AAA ・・・
3/2 AAA ・・・
3/3 BBB ・・・
3/4 BBB ・・・
3/5 CCC ・・・
  def index
  #ransackで日付の期間で抽出
    @q = Game.ransack(params[:q])
    @q.game_date_gteq = Time.now.strftime("%Y-01-01") if @q.game_date_gteq.nil?
    @q.game_date_lteq = Time.now.strftime("%Y-12-31") if @q.game_date_lteq.nil?    
    @games = @q.result(distinct: true)

  #Highchartsでグラフを作成
    #ハッシュを作成
    @@members={}
    @games.sort.each do |g|
      if @@members.key?(g.member.name) #名前の重複チェック
        @@members[g.member.name] =  @@members[g.member.name] +1  #名前が存在する場合はカウントアップ
      else
        @@members[g.member.name] =  1 #名前が存在しない場合はハッシュに追加        
      end
    end      

    #Highcherts用の変数にハッシュの値を格納
    category =[]   
    current_quantity = []    
    @@members.each do |m1,m2|
      category<<(m1)
      current_quantity<<(m2)
    end

  #Highchartsの設定
    @graph = LazyHighCharts::HighChart.new('graph') do |f|
      f.title(text: '参加数の推移')
      f.xAxis(categories: category)
      f.series(name: '参加数', data: current_quantity)
      f.chart(type: "bar") #棒グラフ
    end

以下のようにHighchartsでグラフに表示できましたが、
良い考えが浮かばず、力技となってしまいました。
他に良い方法はありますでしょうか?

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

力技をしたところ大変申し訳ないのですが。
こんな感じになると思います。短くなりすぎですかね?

#ransackで日付の期間で抽出
    @q = Game.joins(:member).references(:member).ransack(params[:q])
    @q.game_date_gteq = Time.now.strftime("%Y-01-01") if @q.game_date_gteq.nil?
    @q.game_date_lteq = Time.now.strftime("%Y-12-31") if @q.game_date_lteq.nil?    
    @games = @q.result(distinct: true).group(:member_id).pluck("members.name,count(games.member_id)")#SQLの段階で集計しときます。
    @games_hash=Hash[*@games.flatten]#hash化

  #Highchartsの設定
    @graph = LazyHighCharts::HighChart.new('graph') do |f|
      f.title(text: '参加数の推移')
      f.xAxis(categories: @games_hash.keys)
      f.series(name: '参加数', data: @games_hash.values)
      f.chart(type: "bar") #棒グラフ
    end

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/12 18:52

    moke様
    早速の回答ありがとうございます

    ググってみても良い方法が見つからず悩んでいました。
    rails初心者の為、ranshackの結果にSQL文が使えるとは考えつきませんでした!

    @games = @q.result(distinct: true).group(:games.member.name).pluck(:games.member.name,sum(:games.member.name))
    としてみましたが、「undefined method `member' for :games:Symbol」とエラーが発生してしまいましたが、ねばって調べてみたいと思います!

    キャンセル

  • 2017/04/12 19:01

    pluck , selectはrails4内でも仕様がぶれています。
    シンボルは使わずにsql文を直打ちした方がいいです。
    構造がわかったので、回答を修正しておきました
    あとシンボルは:games.member.nameの様な使い方ができません。
    注意してください

    キャンセル

  • 2017/04/13 10:15

    moke様
    度々の回答ありがとうございます

    「Game.joins(:member).references(:member).ransack(params[:q])」の変更に気づかず
    時間が掛かってしまいました。すいません!

    join句も簡単にできるんですね!感動しました!
    力技のコードがはずかしいです。

    order by も使えそうなので、降順に並べ替えしてみようと思います。

    ありがとうございました!
    また、よろしくお願いします!

    キャンセル

  • 2017/04/13 10:21 編集

    ransack自体がactiverecordを支えるArelTableを基に作られているので。
    .ransack(params[:q])の前とresultのあとではactiverecordです。
    method chainが繋がります。もちろんscopeもOK

    キャンセル

  • 2017/04/13 10:29

    ransack と Highcharts最高です!
    色々データを可視化して遊んでみたいと思います!
    ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails

    7718questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Highcharts

    39questions

    HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。