インスタンスメソッドの理解
ずっともやっとしてた部分を整理したらアハ体験があったのでまとめる。
こんなモデルがある場合。
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を引数にする。