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

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

ただいまの
回答率

90.52%

  • Ruby on Rails

    7246questions

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

  • Highcharts

    34questions

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

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

解決済

回答 1

投稿 編集

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

seesaajira-

score 43

モデル
【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最高です!
    色々データを可視化して遊んでみたいと思います!
    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    javascript関数記載の使い分け

    javascriptの関数の記載方法について、 プログラムの正しさ、管理のしやすさ、メモリ等のクライアント負荷等の観点で どれが適切か教えてください。 現在の記載、悩みは

  • 解決済

    【highcharts】同じ種類のグラフを複数表示したい

    【やりたいこと】 PHP+「highcharts」でグラフ作成に挑戦してます。 同一ページ内に、同じ種類のグラフを複数作成したいです。 ※グラフ数は可変 【参考にしたペ

  • 解決済

    RspecでRansackのテストを成功させるには

    Rspecでコントローラーのテストを行っていたところ、Ransackの検索テストでエラーが発生し、自分一人では解決に至らないので質問させていただきます。 http://bib

  • 解決済

    エラーメッセージ:No Ransack::Search object was provided to...

    前提・実現したいこと Ruby on railsにてイベント一覧が表示されるシステムを作っています。 そのイベントを検索する機能を実装するべく、gemの「Ransack」を導入

  • 解決済

    Rails5でransackを利用したチェックボックスの検索について

    前提・実現したいこと ransackを利用して、チェックボックスの検索機能を実現したいです。 発生している問題 テキストフィールドやセレクトボックスの検索はできるのですが

  • 解決済

    highchartsで作成したグラフが表示されない

    プログラム初心者です。 highchartsを使ってhtmlファイルを表示させたいのですが、うまくいきません。(黒色の画面表示になってしまいます) こちらのブログを参考にして作

  • 受付中

    highchartのx軸をDBから抽出した日付にしたい

    タイトルの通りなのですが、現在DBから日付毎のデータをカウントして変数に入れてます。 date                  件数 2017/01/10         10

  • 解決済

    LaravelでUndefined variable

    blade上で日付検索をしてConroller内でその日付を$hidukeという変数に入れてwhereに書いています。 そしてそのクエリを$sqlという変数に入れて先ほどと同じbl

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

  • Ruby on Rails

    7246questions

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

  • Highcharts

    34questions

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