LoginSignup
1
1

More than 1 year has passed since last update.

ActiveRecordメモ

Last updated at Posted at 2020-02-12

find

user = User.find(97)
user = User.find(97, 103) # 複数の場合

主キー(基本的にid)に対応するレコードを取り出すことができる。
見つからない場合、例外(ActiveRecord::RecordNotFound)が発生する。

find_by

user = User.find_by(email: 'hogehoge@example.com')
user2 = User.find_by(age: 24, name: 'Jack')

与えられた条件に合致するレコードのうち、最初の1件を取り出す。
複数条件で絞り込むこともできる。
見つからない場合nilを返す。

where

users = User.where(age: 24) #24才のユーザー
users2 = User.where(age: [24, 26]) #24才or26才のユーザー
users3 = User.where(age: 24).limit(3).order(id: :asc) #24才のユーザーをidが小さい方から3人
users4 = User.where.not(age: 24) #24才以外のユーザー
users5 = User.where(age: 24).where(region: 'Asia') #24才でアジアに住むユーザー
users6 = User.where(age: 24).or(User.where(name: 'Jack')) #24才、またはJackという名前のユーザー
users7 = User.where(age: 24).where(region: 'Asia').or(User.where(name: 'Jack')) #24才でアジアに住むユーザー、またはJackという名前のユーザー

与えられた条件に合致するレコードの集合を取り出す。
見つからない場合ActiveRecord_Relationクラスを返す。空の配列っぽいけど、配列ではないらしい。

結合

パターンが多すぎるので、使用したものを適宜追加するスタイルでいきます。

1対多

使用するデータ
class User < ApplicationRecord
  has_many :items
end

class Item < ApplicationRecord
  belongs_to :user
end
「user>email」,「item>price」の複数条件で検索し、全てのカラムのデータを取得
users = User.joins(:items).select("users.*, items.*").where(users: {email: 'hogehoge@example.com'}).where(items: {price: 300})

selectで取得するカラム名を指定
where(テーブル名{検索条件})で検索条件を指定

1対1

使用するデータ
class User < ApplicationRecord
  has_one :user_datum
end

class UserDatum < ApplicationRecord
  belongs_to :user
end
user_data>email受け取りフラグが立っているユーザーを取得
users = User.joins(:user_datum).select('users.*, user_data.*').where(user_data: {receive_email: 1})

joinsの引数が単数形になる。
※dataの単数形がdatum

特定の時間より前

User.where('updated_at <= ?', Time.zone.parse('2020/09/08 15:50:00'))

関連テーブルのレコード数でソート

class PLine < ApplicationRecord
  has_many :likes, dependent: :destroy
end

class Like < ApplicationRecord
  belongs_to :p_line
end
@p_lines = PLine.select('p_lines.*', 'count(likes.id) AS favs')
                .left_joins(:likes)
                .group('p_lines.id')
                .order('favs desc')
<% @p_lines.each do |p_line| %>
  <p><%= p_line.p_line %></p>
  <p><%= p_line.favs %> points</p>
<% end %>

関連カラムが複数あって、変数の値がどちらかに一致する。関連カラムをすべてincludeしたい。

class Mc < ApplicationRecord
  has_many :videos
end

class Video < ApplicationRecord
  belongs_to :mc1, class_name: 'Mc'
  belongs_to :mc2, class_name: 'Mc'
end
@videos = Video.includes(:mc1, :mc2).where(mc1_id: @mc)
               .or(Video.includes(:mc1, :mc2).where(mc2_id: @mc))

statusが0かつその他のどれかが1

@orders = Order.where(status: 0)
                   .merge(Order.stock_status_done.or(Order.content_status_done).or(Order.email_status_done).or(Order.shipping_status_done).or(Order.where.not(personnel_id: nil)))

参考

【rails】find・find_by・whereについてまとめてみた

1
1
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
1
1