プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Ruby on Rails】Active Recordの絞り込みメソッドまとめ
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Ruby on Rails】Active Recordの絞り込みメソッドまとめ

03.22

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

データ取得系

where

データを絞り込みます。「ActiveRecord_Relation」というクラスが返ってきます。検索にヒットしたデータは全件データを取得できますが、プログラム上でインスタンスとして自由に操作することはできないです。

使用例

1
User.where(name: "名前1")

find

モデルのidを指定してレコードを抽出することができます。モデルインスタンスが入手できます。

1
User.all.find(2)

なお、上述したwhereで絞り込んでからfindメソッドでモデルのインスタンスを取得するということも可能です。

1
User.where(name: "名前1").find(1)

find_by

モデルのid以外のカラムを指定してレコードを抽出することができます。ただし、最初にヒットした1件のデータしか取得できないです。モデルインスタンスが入手できます。

1
User.all.find_by(name:"名前2")

pluck

DBから指定したカラムのデータをArray(配列)で一覧取得します。

使用例

Userモデルからnameカラムの内容を取得する例です。

1
User.pluck(:name)

whereで条件を絞ってから取得することも可能です。

1
User.where(family_id:1).pluck(:name)

map

DBから指定したカラムのデータをArray(配列)で一覧取得します。

1
User.map(&:name)

pluckとmapの使い分け

pluckの方が1度のSQL発行においては指定したカラムのみ取得するので高速です。ただ、ループ処理の中で何度もメソッドを実行する場合はmapは一度しかSQLを発行しないので高速になります。

order

データを並び替える。

昇順(デフォルト)

1
User.all.order(:name)

降順

1
User.all.order(name: "DESC")

joins

他の関連テーブルと内部結合をします。

使用例

1
Family.joins(:user)

merge

joinの結合先のscopeを使う場合に使用する。mergeを利用すれば結合先のscopeを呼び出すことが可能です。

1
2
3
4
5
6
7
8
9
class 子モデル < ApplicationRecord
  scope :scopeメソッド名, -> { where(xxx) }
end
 
class 親モデル < ApplicationRecord
  has_many :movies
end
 
親モデル.joins(:子モデル).merge(子モデル.scopeメソッド名)

group

グループ化する。

使用例

count関数と組み合わせた例

1
User.all.group(:name).count

出力結果

下記のように種類ごとに件数が集計してハッシュ形式で出力されます。

1
{"名前1"=>1, "名前2"=>1, "名前3"=>1, "名前4"=>1, "名前5"=>1, "名前6"=>1, "名前7"=>1, "名前8"=>1}

select

SQLのSELECT句です。カラムを絞ることができます。ActiveRecordが返ります。

1
User.select('name')

limit

SQLのLIMIT句です。取得個数を指定することができます。

1
User.all.limit(2)

selectとpluckの比較

SQLは同じ

生成されるSQLはselectもpluckもどちらも同じです。

1
SELECT `モデル名`.`カラム名` FROM `モデル名`

サブクエリで使う場合

サブクエリ内でそれぞれ実行したらどちらもSQLの発行回数は1回でありそこまで大きな違いはなかった。

selectの場合

1
2
3
Project.where(id:Category.find(1).category_projects.select(:project_id))
 
SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (SELECT "category_projects"."project_id" FROM "category_projects" WHERE "category_projects"."category_id" = ?) LIMIT ?

pluckの場合

1
2
3
Project.where(id:Category.find(1).category_projects.pluck(:project_id))
 
SELECT "projects".* FROM "projects" WHERE "projects"."id" IN (?, ?) LIMIT ?

スポンサーリンク
  • 2020 03.22
  • miyabisan2
  • コメントを書く
  • Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2020 12.12

    【Ruby on Rails】「プレゼンター(デコレーター)」について

  2. 2020 07.18

    【Ruby on Rails】環境変数に関する知識、direnv

  3. 2019 12.01

    【Rspec】基本的な書き方、タグなど

  4. 2018 06.18

    【Ruby on Rails】フォルダ構成や、主要ファイルについて

  5. 2019 11.30

    【Ruby on Rails】モデル同士を関連づけを便利に扱う機能

  6. 2022 10.30

    【Rails】「rubocop」の導入、ソースレビューのポイントなど

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【RSpec】高速化の手法(ParallelTests…

【Ruby on Rails】「Flashメッセージ」…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー