前提・実現したいこと
読書時間の記録アプリを作成しています。
期間を指定した上(0時間の日は記載しないのではなく、0であることがわかるようにする)で、日付、カテゴリ別の読書時間を積み上げ棒グラフとして作成したのですが、
コードが無駄に長い気がします。
下記記載内容でひとまず形にはなったのですが、もっと短く書く方法はないでしょうか
ご存知の方がおられましたらご教示お願い致します
関係するテーブル
bookshelves categories records BookshelfとCategoryが1対1で繋がっています。 BookshelfとRecordは1対多の関係です。 categoriesはマスタとして利用しており、6種類固定です。
該当のソースコード
def index hash ={} #1週間分の連想配列をvalue0で作る (Date.parse((Date.today - 6).to_s)..Date.parse((Date.today).to_s)).each do |date| hash.store(date,0) end #棒グラフのラベルを取得 @labels = hash.keys #カテゴリーの数だけ繰り返し実施 for i in 1..6 do datahash = Record.reorder(nil).eager_load(bookshelf: :category) .where(yyyymmdd:(Date.today - 6)..(Date.today)) .where("categories.id=#{i}") .group("records.yyyymmdd") .order("categories.id").sum(:summinutes) #hashの値を初期化 hash.each {|key,value| hash.store(key,0) } #datahashの値をhashに更新 datahash.each {|key, value| hash.store(key,value) } #回数に応じてインスタンス変数に値を入れる case i when 1 @r1 = hash.values when 2 @r2 = hash.values when 3 @r3 = hash.values when 4 @r4 = hash.values when 5 @r5 = hash.values when 6 @r6 = hash.values end end end
index.html.slim
canvas#myChart width="900" height="400" javascript: var ctx = document.getElementById("myChart").getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', data: { labels:#{@labels.to_json.html_safe} , datasets: [ { label:"カテゴリなし", data:#{@r1} , backgroundColor: '#ebebeb' }, { label:"小説", data:#{@r2}, backgroundColor: '#ff8484' }, { label:"ビジネス", data:#{@r3}, backgroundColor: 'rgba(102, 127, 255, 0.859)' }, { label:"自己啓発", data:#{@r4}, backgroundColor: 'rgba(255, 181, 102, 0.859)' }, { label:"資格", data:#{@r5}, backgroundColor: 'rgba(175, 244, 141, 0.776)' }, { label:"IT", data:#{@r6}, backgroundColor:'rgba(141, 218, 244, 0.776)' } ] }, options: { scales: { xAxes: [{ stacked: true }], yAxes: [{ stacked: true }] } } });
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/25 15:04
2020/05/25 15:48
2020/05/29 04:26