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(...)