読者です 読者をやめる 読者になる 読者になる

ECのウェブ担当者のメモ

ECサイトを運営管理している、WEB担当プログラマのメモ

スポンサーリンク

Railsで中間テーブルと関連テーブルのすっきりとしたインサート

Rails

f:id:jun9632:20160214082321p:plain

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

スケジュールを削除した際に、中間テーブルのレコードも削除してくれます。

関連記事

marketing-web.hatenablog.com