経緯
開発しているアプリで必要になったのでまとめ
何がしたいか
usersテーブルに紐付いているIfには複数のThenがあるというのを実装したかった。
参考
Rails Tutorial14章
モデル同士のアソシエーションの記述
モデルとテーブルの関係1(user)
もととなるuserテーブルを作ります。
migration_file
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, null: false, unique: true
t.timestamps
end
end
end
・user.rb
userはたくさんのsituation(if)を持っていて、
situation(if)を通してたくさんのbehavior(then)を持っています。
モデルとテーブルの関係2(behavior)
migration_file
class CreateBehaviors < ActiveRecord::Migration[5.1]
def change
create_table :behaviors do |t|
t.text :name, null: false, unique:true
t.timestamps
end
end
end
reference(参照)はテーブル同士の関係性を示します。
モデルとテーブルの関係3(situation)
ここでbehavior(then)とuserの間を結ぶ中間テーブルを作成しますが、
そこでreferenceというパラメータを使います。
class CreateSituations < ActiveRecord::Migration[5.1]
def change
create_table :situations do |t|
t.references :user, foreign_key: true
t.references :behavior, foreign_key: true
t.timestamps
end
end
end
・user.rb
userはたくさんのbehavior(then)を持っていて、
situation(if)を通してたくさんのbehavior(then)を持っています。
中間テーブルを通して繋がっているものには
through: :situations
というkeyをつけます。
class User < ApplicationRecord
has_many :behaviors, through: :situations, dependent: :destroy
has_many :situations,
behavior.rb
User.rbとほぼ同じです。
accepts_nested_attributes_for
というkeyは、
他のモデルを一括で更新、保存できるようにするものです。
ここではbehavior(then)を保存するのと同時にsituationsを更新できるようにしています。
behavior.rb
class Behavior < ApplicationRecord
has_many :users, through: :situations
has_many :situations
accepts_nested_attributes_for :situations
end
situation.rb
group_userは1つのuser、1つのbehaviorに属しています。
よって、このように記述します。
class Situation < ApplicationRecord
belongs_to :user
belongs_to :behavior
end