データ取得系
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 ? |
この記事へのコメントはありません。