Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@d0ne1s

ActiveRecordメモ

find

user = User.find(97)

主キー(基本的に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).limit(3).order(id: :asc) #24才のユーザーをidが小さい方から3人
users3 = User.where.not(age: 24) #24才以外のユーザー
users4 = User.where(age: 24).where(region: 'Asia') #24才でアジアに住むユーザー
users5 = User.where(age: 24).or(User.where(name: 'Jack')) #24才、またはJackという名前のユーザー
users6 = 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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
d0ne1s
RailsとTailwindが好きなフリーランスエンジニア。 Qiitaの記事検索サービスqiigle.comを運営。 最近はAWSを勉強しなおしてます。 Twitterものぞいてくれるとうれしいです🦈
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?