dev/mom0tomo

技術メモ

Railsのモデルと一対多のリレーションのまとめ

読んだもの

Rails4で1対多のリレーションをモデルに実装する - Rails Webook Active Record の関連付け (アソシエーション) | Rails ガイド

学んだこと

下記のようなUser has many Itemsという関係のモデルを考える。

user.rb

class User < ApplicationRecord
  has_many :items
end

item.rb

class Item < ApplicationRecord
  belongs_to :user

  validates :user_id, presence: true
end

指定できるオプション

has_many / belongs_toメソッドには下記のオプションが指定できる。

  • class_name
    • 関連するモデルのクラス名を指定する。
    • リレーションの名前(has_manyの直後に指定する。上記の例ではitems)https://railsguides.jp/association_basics.htmlと参照先のクラス名を異なるものにできる。
  • foreign_key
    • 参照する外部キーの名前を指定する。
    • 指定しない場合、参照先のモデル名_idになる(上記の例ではuser_id)。

使えるようになるメソッド

has_many と belongs_to で一対多の関係を指定することで、下記のようなメソッドが使えるようになる。

userとitemの作成と保存に関するメソッド

# userを作成し、DBに保存する
user = User.create(name: "momo")

# item1を作成する
item1 = user.items.build(content: 'アイテム1') 

# item1をDBに保存する
item1.save

# item2をuserとの関係を示して作成し、保存する
item2 = user.items.create(content: 'アイテム2はuserのつくるitem')

userとitemのリレーションに関するメソッド

# itemオブジェクトの配列
user.items

# true # itemオブジェクトが存在するか判定する
user.items.present?

# userオブジェクト(itemを持っているuser)
item1.user

userの持つitemから検索するメソッド

# userの持つitemから条件を指定して検索する
user.items.find(...)

user.items.find_by(...)

user.items.where(...)