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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Highcharts

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

Ruby on Rails

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

Q&A

解決済

1回答

2348閲覧

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

seesaajira-

総合スコア107

Highcharts

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/04/11 07:03

編集2017/04/12 09:40
モデル 【game.rb】 belongs_to :member 【member.rb】 has_many :games

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

日付名前・・・
3/1AAA・・・
3/2AAA・・・
3/2AAA・・・
3/3BBB・・・
3/4BBB・・・
3/5CCC・・・
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でグラフに表示できましたが、
良い考えが浮かばず、力技となってしまいました。
他に良い方法はありますでしょうか?

イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

ruby

1#ransackで日付の期間で抽出 2 @q = Game.joins(:member).references(:member).ransack(params[:q]) 3 @q.game_date_gteq = Time.now.strftime("%Y-01-01") if @q.game_date_gteq.nil? 4 @q.game_date_lteq = Time.now.strftime("%Y-12-31") if @q.game_date_lteq.nil? 5 @games = @q.result(distinct: true).group(:member_id).pluck("members.name,count(games.member_id)")#SQLの段階で集計しときます。 6 @games_hash=Hash[*@games.flatten]#hash化 7 8 #Highchartsの設定 9 @graph = LazyHighCharts::HighChart.new('graph') do |f| 10 f.title(text: '参加数の推移') 11 f.xAxis(categories: @games_hash.keys) 12 f.series(name: '参加数', data: @games_hash.values) 13 f.chart(type: "bar") #棒グラフ 14 end

投稿2017/04/12 09:08

編集2017/04/12 09:58
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2017/04/12 09: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」とエラーが発生してしまいましたが、ねばって調べてみたいと思います!
moke

2017/04/12 10:01

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

2017/04/13 01:15

moke様 度々の回答ありがとうございます 「Game.joins(:member).references(:member).ransack(params[:q])」の変更に気づかず 時間が掛かってしまいました。すいません! join句も簡単にできるんですね!感動しました! 力技のコードがはずかしいです。 order by も使えそうなので、降順に並べ替えしてみようと思います。 ありがとうございました! また、よろしくお願いします!
moke

2017/04/13 01:22 編集

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

2017/04/13 01:29

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問