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