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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

830閲覧

【Rails】期待値をもったレコードを期日分事前に登録させたい

yastinbieber

総合スコア49

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/07/26 03:59

編集2020/07/29 09:34

前提・実現したいこと

体重管理機能を実装しています。
現状だと日次単位でユーザーに入力をしてもらい、テーブル・グラフにて反映させております。

一部

別途ユーザーには「期間」と「目標体重」を入力してもらっているのでそれらを計算して『期待値』を割り出したいと考えております。

要は下記の様な形です。(下記画像はエクセルで作成)
イメージ説明

おそらく下記のようなグラフを作成するには、
『先に日付と期待値の入ったレコードを日数分自動で作成する』ことが必要になってくるかと思いますがそのやり方がわかりません。

上記のようなグラフを作成する上でなにか具体的なやり方や助言をいただけますと幸いです。

該当のソースコード

##index.html.erb <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <div class="card card-nav-tabs"> <h4 class="card-header card-header-success">WeightDiaryRecord/体重記録</h4> <div class="card-body"> <%= form_with(scope: :search, url: weightchanges_path, method: :get, local: true) do |f| %> <div class="row"> <div class="form-group col-md-4 has-success"> <%= f.label :date/期間を指定する(初め), class: "bmd-label-floating" %> <%= f.date_field :date_from, value: @search_params[:date_from], class: 'form-control' %> </div> <div class="form-group col-md-4 has-success"> <%= f.label :date/(終わり), class: "bmd-label-floating" %> <%= f.date_field :date_to, value: @search_params[:date_to], class: 'form-control' %> </div> <div class="form-group col-md-4 has-success"><br> <%= f.submit "検索", class: "btn btn-raised btn-primary" %> </div> </div> <% end %> <table class="table mt-5"> <thead> <tr> <th class="text-left">Date/日付</th> <th class="text-right">Weight/体重</th> <th class="text-right">Action</th> </tr> </thead> <tbody> <% @weightchanges.each do |weightchange| %> <tr><td class="text-left"><%= weightchange.date %></td> <td class="text-right"><%= weightchange.todayweight %>Kg</td> <td class="td-actions text-right"> <%= link_to edit_weightchange_path(weightchange), class: "btn btn-info" do %> <i class="material-icons">edit</i> <% end %> <%= link_to weightchange_path(weightchange), method: :delete, remote: true, class: "btn btn-danger" do %> <i class="material-icons">close</i> <% end %> </td></tr> <% end %> </tbody> </table> </div> </div> </div> </div><br> <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12"> <div class="card card-nav-tabs"> <h4 class="card-header card-header-success">WeightChange/期間中体重推移</h4> <div class="card-body"> <% if @weightchanges.present? %> <canvas id="myLineChart"></canvas> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.js"></script> <script> var ctx = document.getElementById("myLineChart"); var myLineChart = new Chart(ctx, { type: 'line', data: { labels: <%= @labels.to_json.html_safe %>, // labels: ["0701", "0702", "0703", "0704", "0705", "0706", "0707"], datasets: [ { label: '実績推移', data: <%= @datas %>, borderColor: "rgba(255,0,0,1)", backgroundColor: "rgba(0,0,0,0)" }, ], }, options: { title: { display: true, text: '体重推移(○月☓日~○月☓日)' }, scales: { yAxes: [{ ticks: { suggestedMax: <%= @max %> +5, suggestedMin: <%= @minimum %> -5, stepSize: 1, callback: function(value, index, values){ return value + 'KG' } } }] }, } }); </script> <% else %> <p>Nodate...</p> <% end %> </div> </div> </div> </div>
##weightchange.rb class Weightchange < ApplicationRecord belongs_to :user belongs_to :idealweight scope :search, -> (search_params) do return if search_params.blank? date_from(search_params[:date_from]) .date_to(search_params[:date_to]) end scope :date_from, -> (from) { where('? <= date', from) if from.present? } scope :date_to, -> (to) { where('date <= ?', to) if to.present? } end
##weightchanges_controller class WeightchangesController < ApplicationController def index @search_params = weightchange_search_params @weightchanges = current_user.weightchanges.search(@search_params) @weightchange_today = current_user.weightchanges.find_by(date: Date.current.all_day) weightchanges = @weightchanges.pluck(:date, :todayweight) @labels = weightchanges.map(&:first) @datas = weightchanges.map(&:second) @max = current_user.weightchanges.maximum(:todayweight) @minimum = current_user.weightchanges.minimum(:todayweight) @sum_column = current_user.weightchanges.size end def new @weightchange = Weightchange.new end def create @weightchange = Weightchange.create(date: weightchange_params[:date], todayweight: weightchange_params[:todayweight], user_id: current_user.id, idealweight_id: current_user.idealweight.id) redirect_to action: :index end def destroy current_user.weightchanges.find(params[:id]).destroy @weightchanges = current_user.weightchanges.all redirect_to action: 'index' end def edit @weightchange = current_user.weightchanges.find(params[:id]) end def update @weightchange = current_user.weightchanges.find(params[:id]) @weightchange.update(weightchange_params) redirect_to action: 'index' end private def weightchange_params params.require(:weightchange).permit(:date, :todayweight, :user_id, :idealweight_id) end def weightchange_search_params params.fetch(:search, {}).permit(:date_from, :date_to) end end

質問に対するご回答をもとに出した内容

##idealweight.rb class Idealweight < ApplicationRecord belongs_to :user has_many :fooddiaries has_many :advicediaries has_many :weightchanges before_save do if user.sex == "男" self.basemetabolism = 13.397*(weight)+4.799*(height)-5.677*(user.age)+88.362 #男性の場合 else self.basemetabolism = 9.247*(weight)+3.098*(height)-4.33*(user.age)+447.593 #女性の場合 end self.kcalburned = (basemetabolism)*(exerciselevel) self.minusweight = (weight)-(targetweight) self.minuskcal = (minusweight)*7000 self.period = ((last_day) - (start_day)).to_i self.minusweight_day = (minusweight) / (period) self.kcalintake = (kcalburned)-(minuskcal)/(period) self.intakeproteingram = (weight)*2 self.intakeproteinkcal = (weight)*2*4 self.intakefatgram = (weight)*0.7 self.intakefatkcal = (weight)*0.7*9 self.intakecarbokcal = (kcalintake)-(intakeproteinkcal)-(intakefatkcal) self.intakecarbogram = (intakecarbokcal)/4 end #リアルタイムでの今日 def today_date @today = Date.today @today.strftime("%Y%m%d").to_i end #ボディメイク開始日 def start_day_date start_day.strftime("%Y%m%d").to_i end #今日は何日目か def what_day ((today_date)+1) - (start_day_date) end end
##weightchange.rb class Weightchange < ApplicationRecord belongs_to :user belongs_to :idealweight before_save do self.expected_weight = (idealweight.weight)-((idealweight.minusweight_day)*(idealweight.what_day)) end end

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

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

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

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

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

guest

回答1

0

ベストアンサー

測定値とともに期待値をplotするわけですから、
Weightchange に期待値も入れるようにしたらどうでしょう。
期待値は目標で決まるわけです。それを求めるmethodは Userに用意します。
多分 目標設定日、目標達成日、現体重、目標体重が入るでしょうから、それを元に
def expected_weight(date) を作り、Weightchangeのcreate時に入込ます。

投稿2020/07/26 04:15

winterboum

総合スコア23567

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

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

yastinbieber

2020/07/29 09:37

ご回答ありがとうございます。 また返信が遅くなり大変申し訳ございません。 自分なりに頂いたご回答をもとに考えてみました。 冗長なコードかとは思いますが一応狙った実装をすることができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問