Railsで中間テーブルと関連テーブルのすっきりとしたインサート
RailsのActiverecordで中間テーブルと関連テーブルを一気にインサートする方法です。
モデルの関係は、以下の様に
User <=> UserSchedule <=> Schedule
UserとScheduleの間にUserScheduleが中間テーブルとして存在することを想定します。
Activerecodeの関連テーブルの設定は以下のようになります。
User, Schedulee, UserScheduleにそれぞれhas_many, through, belongs_toを設定します。 設定に関しては、1対多 や 多対多で変わってくるので適宜変更してください。
下記の例では多対多を想定しています。
user.rb
class User < ActiveRecord::Base has_many :user_schedules has_many :schedules, through: :user_schedules end
schedule.rb
class Schedule < ActiveRecord::Base has_many :user_schedules, dependent: :delete_all has_many :user, through: :user_schedules end
user_schedule.rb
class User < ActiveRecord::Base belongs_to :user belongs_to :schedule end
中間テーブル と 関連テーブルのインサート
実際に中間テーブル(user_schedule)と関連テーブル(schedule)にインサートしようとすると あれ?どうやるだったっけという気分によくなるります。 そんな時は、
user = User.find(1) schedule = user.schedules.build(schedule_params) user.save ・・・・ def schedule_params params.require(:schedule).permit(:date, :comment) end
上記を実行すると、インサート文のSQLを2回投げてくれて、コード上もすっきりとインサートできます。
中間テーブルのレコードを削除
また schedule.rb に以下のように dependent: :delete_allをつけておくと
has_many :user_schedules, dependent: :delete_all
スケジュールを削除した際に、中間テーブルのレコードも削除してくれます。