動作環境
- Rails 5.2.4.2
- PostgreSQL 12.2
前提
従業員の活動を記録するデータベースにおいて、従業員(employees) は 活動(activities)と多対多の関係にあります。
下記のようなUIで一気に活動に参加した従業員を記録したく、
次のようにコードを書きました。
作成したコード
Model
activitiesとemployeesで多対多の関係を定義し、中間テーブルをactivity_employees
としています。
Ruby
1class Employee < ApplicationRecord 2 has_many :activity_employees, dependent: :destroy 3 has_many :activities, through: :activity_employees 4end
ruby
1class Activity < ApplicationRecord 2 has_many :activity_employees, dependent: :destroy 3 has_many :employees, through: :activity_employees 4 accepts_nested_attributes_for :activity_employees, allow_destroy: true 5 6 # 今回のエラーに関係ありそうなので入れています 7 has_many :activity_logs, dependent: :destroy 8 has_many :staffs, through: :activity_logs 9 accepts_nested_attributes_for :activity_logs 10end
ruby
1class ActivityEmployee < ApplicationRecord 2 belongs_to :activity 3 belongs_to :employee 4end
Controller
一気にデータを受け取れるよう、{employee_ids: []}
をstrong paramaterに入れています。
ruby
1class ActivitiesController < ApplicationController 2 # 略 3 def create 4 @activity = @facility.activities.build(activity_params) 5 if @activity.save 6 # 処理 7 else 8 # 処理 9 end 10 end 11 12 private 13 def activity_params 14 params.require(:activity).permit( 15 :activity_type, 16 # 略, 17 {employee_ids: []}, 18 activity_logs_attributes: [:staff_id, :carried_out, :got_appointment]) 19 end 20end
View
ruby
1= form_with model: [@facility, @activity], class: "p-input-form", local: true do |f| 2 3 = f.collection_check_boxes :employee_ids, @employees, :id, :name, include_hidden: false do |t| 4 = t.label(class: "c-check-box__label mr-4") { t.check_box(class: "c-check-box") + t.text }
起こっている問題
上記のコードでデータを保存しようとすると、下記のエラーが出ます。
staffs
テーブルにデータを保存しようとはしていないのに、なぜ、staffs
テーブルの参照整合性を崩すというエラーが出るのかわかりません。
調べたこと
activity_params
として送っているデータの中身を調べました。
[1] pry(#<ActivitiesController>)> activity_params => <ActionController::Parameters { "activity_type"=>"event", # 中略 "employee_ids"=>["33"], "activity_logs_attributes"=><ActionController::Parameters { "0"=><ActionController::Parameters { "staff_id"=>"1", "carried_out"=>"false", "got_appointment"=>"false" } permitted: true> } permitted: true> } permitted: true>
特にネストがおかしいところはなさそうです。
なぜ、アソシエーションがないはずのstaffs
テーブルの参照性を崩すというエラーが出いるのでしょうか?考えられる点だけでもアドバイスいただけると嬉しいです。
どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/14 00:50 編集
2020/08/14 01:04