dev/mom0tomo

技術メモ

インスタンスメソッドの理解

ずっともやっとしてた部分を整理したらアハ体験があったのでまとめる。

こんなモデルがある場合。

models/user.rb

class User < ApplicationRecord
  has_many :items
end

models/item.rb

class Item < ApplicationRecord
  belongs_to :user

  validates :user_id, presence: true
end

中間テーブルはLikeとする。

models/like.rb

class Like < ApplicationRecord
  belongs_to :user
  belongs_to :item

  validates :user_id, presence: true
  validates :item_id, presence: true
end

上の関係は英文にするとこんな風に書ける。

User like item.

冠詞がないのと複数形じゃないのはご愛嬌。

モデル、メソッドのレシーバ・引数の関係を上記の英文を例に考えてみる。

  • モデルは主語を担う。(User)
  • レシーバは動詞を担う。(like)
  • 引数は目的語を担う。(item)

上の関係をメソッドで表す。

models/user.rb

class User < ApplicationRecord
  has_many :items

  has_many :likes
  has_many :like_items, through: :likes, source: :item

  def like(item)
    self.likes.find_or_create_by(item_id: item.id)
  end
end

主語はUserなので、Userモデルにメソッドを書く。
メソッドのレシーバが動詞なので、likeというインスタンスメソッドをつくる。
メソッドの引数は目的語なので、itemを引数にする。