0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActiveRecordモデル操作チートシート

Posted at

初めに

日々の業務でよく使用するActiveRecordのモデル操作についてまとめていきます。
基本的な操作でも「あれ?書き方どうだっけかな?」となることが多いので、そういった方の早見表的な感じでお役に立てると非常に嬉しいです。

誤り・もっとイケてる書き方があれば、コメントいただけると嬉しいです。

取得

取得するデータの絞り込み

1つのカラムのみや配列で返されても問題ない場合は、 pluckを使用し、それ以外は selectを使用するようにしています。

  # select
  User.select(:id, :name).find_by(name: "hoge")
  # pluck
  User.where(name: "hoge").pluck(:id)

データを1件取得

特定のカラムで取得

  User.find_by(name: "hoge")

idで取得
データがない場合エラーになる

  User.find(user_id)

idで取得
データがない場合nilを返す

  User.find_by_id(user_id)

複数データの中から初めの1件のみ取得
データが空の場合でも、エラーにはならない

  User.where(name: "hoge").first

複数データの中から最後の1件のみ取得
データが空の場合でも、エラーにはならない

  User.where(name: "hoge").last

複数データ取得

  User.where(name: "hoge")

以外

  User.where.not(name: "hoge")

あるいは・もしくは

  User.where(name: "hoge").or(User.where(name: "foo"))

あいまい検索

  # 前方一致
  User.where("name LIKE ?", "%ho")
  # 部分一致
  User.where("name LIKE ?", "%ho%")
  # 後方一致
  User.where("name LIKE ?", "ho%")

比較

  # 以上
  User.where("login_count >= ?", 10)
  # を超える
  User.where("login_count > ?", 10)
  # 以下
  User.where("login_count <= ?", 10)
  # 未満
  User.where("login_count < ?", 10)

テーブル結合

join

  User.joins(:posts)

left join

  User.left_joins(:posts)

join先のテーブルで絞り込み

  User.joins(:posts).where(posts: {title: "hoge"})

作成

通常

  User.create!(name: "hoge")
  # 下記も同じ
  user = User.new(name: "hoge")
  user.save!

find_by、存在しなければインスタンスを生成

作成はされない

  User.find_or_initialize_by!(name: "hoge")

find_by、存在しなければ作成

  User.find_or_create_by!(name: "hoge")

更新

1件

  User.find(id).update!(name: "foo")

複数

updated_atは更新されないため、明示的に更新する必要がある

  User.update_all(name: "foo", updated_at: Time.now)

削除

1件

  User.find(id).destroy!

複数

  User.destroy_all

並び替え

昇順

何も指定しなければ ASCだけど、指定した方がわかりやすいと個人的には思っています。

  User.order(:id) 
  User.order(id: :asc) 
  # これでもOK!
  User.order(id: "ASC") 

降順

  User.order(id: :desc)

複数指定

  User.order(id: :desc, nam: :asc)
  # これでも同じ
  User.order(id: :desc).order(name: :asc)

その他

n+1対策(includes)

  User.includes(:post)
  # 複数
  User.includes(:post, :post2)
  # include したテーブルでのn+1も対策する
  User.includes(post: :comments)

プレースホルダーの複数指定

  User.where("login_count >= ? AND logout_count >=?", 10, 2)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?