初めに
日々の業務でよく使用する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)