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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

742閲覧

【Rails】モデル間で紐付けをするとDBにデータが格納されなくなる

yastinbieber

総合スコア49

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/05/27 03:28

編集2020/05/28 03:35

前提・実現したいこと

モデルの関係をもった状態で日次で食べた食品情報をDBに格納できるようにしたい

現状

日次で食べた食品情報を格納するFooddiaryモデルとユーザーの1日あたりに食べてよい食品情報を格納するIdealweightモデルを紐付けするとDBに食べた食品情報が格納されなくなってしまいます。

なおモデルの紐付けを外すと正常に格納されます。

紐付けがうまくいっていないのか。
なぜ格納されないのか調べても今ひとつわからなかったため質問させていただきました。

またfooddairyモデル(日次食品情報)とidealweightモデル(そのユーザーの1日あたりにとっていい食品情報)は多:1で考えています。

※該当コードは下記にまとめて記述しております。

###binding.pryすると

From: /home/ec2-user/environment/bodymake/app/controllers/fooddiaries_controller.rb:21 FooddiariesController#create: 19: def create 20: @fooddiary = current_user.fooddiaries.create(fooddiary_params) => 21: binding.pry 22: redirect_to action: 'index' 23: end [1] pry(#<FooddiariesController>)> @fooddiary.errors.messages => {:idealweight=>["must exist"], :idealweight_id=>["can't be blank"]}

補足

rails

1##fooddiaries_controller.rb 2 3class FooddiariesController < ApplicationController 4 5 def new 6 @fooddiary = current_user.fooddiaries.new 7 end 8 9 def create 10 @fooddiary = current_user.fooddiaries.create(fooddiary_params) 11 redirect_to action: 'index' 12 end 13 14 private 15 def fooddiary_params 16 params.require(:fooddiary).permit(:gram, :kcal, :protein, :fat, :carbo, :timing, :foodname, :fooddate_id, :user_id, :idealweight_id) 17 end 18 19end 20

rails

1##fooddiaries/new.html.erb 2 3<%= form_for @fooddiary do |f| %> 4 <tbody> 5 <tr> 6 <th>foodname</th> 7 <th>gram</th> 8 <th>timing</th> 9 </tr><br> 10 <%= f.collection_select :fooddate_id, Fooddate.all, :id, :foodname %> 11 <td><%= f.number_field :gram, placeholder: "gram" %></td> 12 <td><%= f.select :timing, ['朝食', '昼食', '夕食', '間食'] %></td> 13 <br><%= f.submit "送信", class: "btn" %> 14 </tbody> 15<% end %> 16

rails

1class Idealweight < ApplicationRecord 2##idealweight.rb 3 4 belongs_to :user 5 has_many :fooddiaries 6 7 before_save do 8 self.basemetabolism = 13.397*(weight)+4.799*(height)-5.677*25+88.362 9 self.kcalburned = (basemetabolism)*(exerciselevel) 10 self.minusweight = (weight)-(targetweight) 11 self.minuskcal = (minusweight)*7000 12 self.kcalintake = (kcalburned)-(minuskcal)/(period) 13 self.intakeproteingram = (weight)*2 14 self.intakeproteinkcal = (weight)*2*4 15 self.intakefatgram = (weight)*0.7 16 self.intakefatkcal = (weight)*0.7*9 17 self.intakecarbokcal = (kcalintake)-(intakeproteinkcal)-(intakefatkcal) 18 self.intakecarbogram = (intakecarbokcal)/4 19 end 20end 21

rails

1##fooddiary.rb 2class Fooddiary < ApplicationRecord 3 4 belongs_to :fooddate 5 6 belongs_to :user 7 validates :user_id, presence: true 8 9 belongs_to :idealweight 10 validates :idealweight_id, presence: true 11 12 def self.search(search) 13 if search 14 where(['created_at LIKE ?', "%#{search}%"]) 15 end 16 end 17 18 before_save do 19 self.kcal = (gram)*(fooddate.kcal) 20 self.protein = (gram)*(fooddate.protein) 21 self.fat = (gram)*(fooddate.fat) 22 self.carbo = (gram)*(fooddate.carbo) 23 end 24 25end 26

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

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

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

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

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

maisumakun

2020/05/27 03:58

Railsのバージョンはいくつですか?
guest

回答1

0

ベストアンサー

binding.pry するなら、@fooddiaries = current_user.fooddiaries.create(fooddiary_params)の後で@fooddiaries.errors.messages してみてください。
何が原因でsaveできないかがわかります。

なお、createで作られるのは一つですから、@fooddiary にしたほうが誤解/勘違いが減ります

投稿2020/05/27 13:41

winterboum

総合スコア23567

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

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

yastinbieber

2020/05/27 14:33

ありがとうございます。@fooddiaryに変更しました。 またご指摘いただいたようにbinding.pryを実施してみたところ下記のように出ました。 [1] pry(#<FooddiariesController>)> @fooddiary.errors.messages => {:idealweight=>["must exist"], :idealweight_id=>["can't be blank"]}
winterboum

2020/05/27 19:59

つまり、これらにデータが入っていないからsaveできなくなっています。 これで解決できればおめでとう。 できなければ、入力するviewとcontrollerを載せてください
yastinbieber

2020/05/28 03:39

解説ありがとうございます。 しかしながらidealweightモデルに情報も入れておりますのでなぜデータが入っていないと出るのかわからない状態です。 恐れ入りますが該当コードを追記しましたのでご確認いただけますと幸いです。
winterboum

2020/05/28 06:10

モデルに項目があり、strongparameterに項目があるからといって、データがあるとは限りません。 viewで入力しているのは :fooddate_id :gram, :timing, の3つ。 strong_paramater には沢山あるけど :kcal, :protein, :fat, :carbo, :foodname, : :user_id, :idealweight_id のデータは送られてこない
yastinbieber

2020/05/28 08:38

そういうことなんですね。 ちなみにviewにて:fooddate_id :gram, :timingのみを記入としていますが、 fooddiary.rbにて before_save do self.kcal = (gram)*(fooddate.kcal) self.protein = (gram)*(fooddate.protein) self.fat = (gram)*(fooddate.fat) self.carbo = (gram)*(fooddate.carbo) end のような形で記載をしており、Mysqlには:kcal, :protein, :fat, :carbo, :foodnameも登録されるようになっています。 上記の点から言うと:user_id, :idealweight_idの部分をviewに記載すれば正式にデータが送られるという認識であっておりますでしょうか?
yastinbieber

2020/05/28 15:58

ありがとうございます。 実際にnew.html.erbにて <%= f.number_field :idealweight_id %> を記載したところ無事にDBに情報が格納され反映されるようになりました。 しかしながらこのidealweightモデルですが、ユーザーの目標数値情報のため毎回入力するものではないのでフォームに入れなくともuser_idと同じ数値を格納したいです。(常にuser_idとidealweight_idは同じ数値である必要があるため。user_idが1ならidealweight_idも必ず1でなくてはならない) そこでidealweight.rbにて before_save do  self.idealweight_id = user_id end のような風にも記載しましたがうまく格納されませんでした。(user_idは無事格納されるため) そこで毎回入力しなくともuser_idと同じ数値を格納できるようにしたいのですがもしよろしければお教えいただけますと幸いです。 度々すみません・・・
winterboum

2020/05/28 22:45

idealweight_id は Idealweight ではなくてFooddiaryのものですから、やるならそちらの before_save です。 user_idはどの時点で手に入るものですか?modelは知らずcontrollerが知っているものだと思うので、before_userで入れられるのが不思議。 Fooddiaryのをsaveしようとしているloginユーザのidですか? でしたらもうひとつの手は、fooddiary_paramsの最後に、  merge(idealweight_id: current_user_id) をつける
yastinbieber

2020/05/29 03:30

ご教示いただきありがとうございます。 controller内のcreate部分を編集したところ無事DBに格納されました。 ■以前 def create @fooddiary = current_user.fooddiaries.create(fooddiary_params) redirect_to action: 'index' end ■以後 def create @fooddiary = Fooddiary.create(gram: fooddiary_params[:gram], kcal: fooddiary_params[:kcal], protein: fooddiary_params[:protein], fat: fooddiary_params[:fat], carbo: fooddiary_params[:carbo], timing: fooddiary_params[:timing], fooddate_id: fooddiary_params[:fooddate_id], user_id: current_user.id, idealweight_id: current_user.id ) redirect_to action: 'index' end 大変勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問