🦝

Active Recordの関連付け(belongs_to)

2024/11/07に公開

関連付け(association)がまったく理解できない

Railsの学習においてORM(object-relational-mapping)の習得は重要だが、
has_many :throughからまったく理解できなくなってしまった。
というわけで、全ての関連付けを改めて文章にしながら復習していく。

関連付けの種類

関連付けのリストは以下の通り,今回はbelongs_toからまとめていく

  • belongs_to
  • has_one
  • has_many
  • has_many :through
  • has_one :through
  • has_and_belongs_to_many

belongs_to

belongs_toは1対1リレーションとも呼ばれ、宣言を行った側のモデルは
他方のモデルに従属(belongs_to)する
モデルでの宣言方法は以下の通り

class Post < AplicationRecord
  belongs_to :user 
end

なお、マイグレーションでの宣言は以下の通り

class CreatePosts < ActiveRecord::Migrateion
  def change
    create_table :posts do |t|
      t.references :user, null: false, foreign_key: true
      t.string :title
      t.text :body
    end
  end
end

references :userを使うことで自動的にuser_idカラムを作成し、デフォルトでインデックスを
追加する。また、外部キー制約をつけるために、foreign_key: trueを指定する。

追加されるメソッド

belogns_toの関連付けによって以下のメソッドが自動的に使用できるようになる

  • user
    post.user
    Postインスタンスから関連するUserインスタンスを取得する
  • user=
    post.user = some_user
    Postインスタンスに関連づけるUserインスタンスをせってい する
  • build_user
    post.build_user(name: "New_user")
    新しいUserインスタンスを生成するが、データーベースには保存されていない
  • create_user
     post.create_user(name: "New_user")
    新しいuserインスタンスを生成し、データベースに保存する
  • create_user!
    create_userと同じだが、レコードが無効な場合にエラーが発生する *通常はnil
    以下のメソッドはの詳細は省略!
  • reload_user
  • reset_user
  • user_changed?
  • user_previously_changed?

Discussion