【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]
このように指定した内容だけを抽出して返してくれる。