Help us understand the problem. What is going on with this article?

Railsの検索まとめ(find、find_by、where、結合)

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

参考

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

d0ne1s
24歳男。プログラミング / Webデザイン / 個人開発 / MCバトル
https://note.mu/d0ne1s
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。
https://admin-guild.slack.com
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした