前提
railsを使ってアプリを作成しています。
生産量と製品コードを入力すると、生産量とコードから参照された製品の情報を表示できるようにしたいと思っています。
モデルは生産量のデータを持つProductions(生産量)モデルと製品の情報を持つGoods(製品)モデルがあります。Productionsモデルには、idとamount(生産量)、Goodsの情報を参照するためにの外部キーであるgood_idのカラムを持っています。Goodsモデルにはidとcode(製品コード)とname(製品名)のカラムを持ちます。また、Goodsモデルにはすでに、製品の情報が入っているものとします。
今、Productionsコントローラのcreateアクションで、Prodectionsモデルに生産量と製品情報を入力しようとしています。
フォームではamount(生産量)とGoodsモデルのcodeの値を入力する形になっています(フォームでは、nameをgood_idとしています)。
この時、amount(生産量)はそのままProductionsモデルに追加できますが、good_idは外部キーなのでそのまま入力できません。なので、入力された値からGoodsモデルのcode情報を参照して、GoodsのidをProductionsのgood_idに追加したいです。
今のままですと、当然、good_idは外部キーなので、データを挿入できませんとエラーになります。
どのようにすれば、外部のモデルを参照して、該当するidを外部キーに挿入できるのでしょうか。
よろしくお願いします。
実現したいこと
入力されたコードからGoodsモデルを参照して、該当するidをProductionsモデルのgood_idに挿入する
発生している問題・エラーメッセージ
ActiveRecord::InvalidForeignKey in ProductionsController#create Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails (`app_development`.`productions`, CONSTRAINT `fk_rails_da7ae25ed8` FOREIGN KEY (`good_id`) REFERENCES `goods` (`id`)): INSERT INTO `productions` (`good_id`, `created_at`, `updated_at`) VALUES (11111, '2019-12-06 03:18:18', '2019-12-06 03:18:18')
該当のソースコード
ruby
1#controller/productions_controller.rb 2class ProductionsController < ApplicationController 3 def index 4 @production = Production.new 5 end 6 7 def create 8 Production.create(production_params) 9 end 10 11 private 12 def production_params 13 params.require(:production).permit(:amount, :goods_id) 14 end 15end
ruby
1#models/production.rb 2class Production < ApplicationRecord 3 belongs_to :good 4end 5 6#models/good.rb 7class Good < ApplicationRecord 8 has_many :productions 9end
html
1#productions/index.html 2<%= form_for [@production], url: productions_path do |f| %> 3 <div class="form__info__date"> 4 <div class="form__info__date__amount"> 5 <%= f.text_field :amount %> 6 </div> 7 <div class="form__info__date__id"> 8 <%= f.text_field :good_id %> 9 </div> 10 <div class="form__info__date__btn"> 11 <%= f.submit 'send', class: "btn" %> 12 </div> 13 </div> 14<% end %>
試したこと
https://teratail.com/questions/100899
このページを参考にfind_byを使って下記のようなコードをparamsのpermit中に記述してみたりしたのですが、syntax errorとなってしまいます。
コードが間違っているのでしょうか。それとも、記述する位置が違うのでしょうか。
ruby
1#controller/productions_controller.rb 2good_id: Good.find_by(code: [:good_id]).id
補足情報(FW/ツールのバージョンなど)
Rails 5.0.7.2
ruby 2.5.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 05:09