1対多のモデルについて

経緯

開発しているアプリで必要になったのでまとめ

何がしたいか

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をつけます。

user.rb
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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です