【rails】railsでよく使うメソッドまとめ その1

勉強する中で出てきたrailsメソッドを忘れないようにメモ。
最終的にはtopページの検索から楽に調べられるようにしたい。。。

includesメソッド

関連テーブルを読み込む際に問題になるのがN+1問題。これを解決してくれるのがincludesである。
Userテーブル

id Name
1 Yasagori
2 Ikarigori
3 Smilegori

Petテーブル

id Name user_id
1 Coco 1
2 Maru 3
3 Kotetsu 2
4 Marin 1

ここでPetテーブルから全てのデータを取ろうとすると大抵こう書く。

def index
  @pets = Pet.all
end

すると1つ1つのデータに対してUserテーブルを読み込みに行くたため、Petテーブルの読み込みと合わせて4+1 = 5回アクセスする。
Petテーブルの数が増えるととんでも無いことになってしまうので、includesを使う。

def index
  @pets = Pet.includes(:user)
end

これで、PetテーブルとUserテーブルをそれぞれ1回ずつしか読みに行かずにデータの取得ができるので時間の削減ができる。

scopeメソッド

上の例で例えばログインしているユーザーのペットデータだけを取得すると

def show
  @pets = Pet.includes(:user).where(user: current_user)
end

とかになるが、Pet.includes(:user)部分は他でも使う場合が多い。
そこでscopeでまとめておくことで可読性を上げることができる。

scope :with_users, -> {
  includes(:user)
}

def index
  @pets = Pet.with_users
end

def show
  @current_pets = Pet.with_users.where(user: current_user)
end

今はscope内にincludeしかないが、引数を渡してwhereを付けたりもできる。

pluckメソッド

データベースの中から指定したカラムを抽出できる。
例えばPetテーブルがあるとすると

id Name Age Dog breed
1 Coco 7 Dachshund
2 Maru 2 Mix
Pet.pluck(:name)
=> "Coco", "Maru"
Pet.pluck(:name, :age)
=> ["Coco", 7], ["Maru", 2]

このように指定した内容だけを抽出して返してくれる。