クエリ
参考:
Active Record クエリインターフェイス | Rails ガイド [公式]
ActiveRecord::QueryMethods | Ruby on Rails API [Official]
使い方
参考:
find、find_by、where などモデルを取得する方法まとめ | Ruby on Rails 始めました
Rails で ActiveRecord / Arel を使って複雑な SELECT 文を実行する方法 | Rails Webook
rails で効率的なクエリを作るための tips 5選 – Qiita
all
スコープ内の全てのオブジェクトを表すリレーションを返す。default_scope
が定義されている場合は、デフォルトスコープ内の全てのオブジェクトを表すリレーションを返す。
参考:
all – ActiveRecord::Scoping::Named::ClassMethods | Ruby on Rails API [Official]
all – rails/named.rb at v5.2.3 · rails/rails – GitHub
current_scope – rails/scoping.rb at v5.2.3 · rails/rails – GitHub
reverse_order
レコードを逆順で取得する。
User.all.reverse_order
参考:
あれっ? 降順って ASC? DESC?そんな時は、reverse_order を使ってみましょう!- Qiita
reverse_order (ActiveRecord::QueryMethods) – APIdock
reverse_order – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
order
参考:
rails で Model から引っこ抜いたデータの並び順を変える Order の使い方を極める – Qiita
order | Rails ドキュメント (railsdoc.com)
order – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
where
参考:
where – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
where | Rails ドキュメント (railsdoc.com)
以下のような SQL を rails 上で実現したい – teratail
where – rails/query_methods.rb at v6.0.0.rc1 · rails/rails – GitHub
where で配列を使う
参考:
Rails の ActiveRecord で where in 句を使う – Qiita
ActiveRecord IN clause | TOEIC 940 点の文系プログラマー
Ruby on Rails で NOT IN な SQL をかく。| そんなこと覚えてない
How to select where ID in Array Rails ActiveRecord without exception – Stack Overflow
Using WHERE IN with Rails prepared statement syntax – Stack Overflow
where field = ? array of possible values – Stack Overflow
where.not
参考:
Rails で where.not を複数連結する場合 – Qiita
Ruby on Rails で NOT IN な SQL をかく。| そんなこと覚えてない
ActiveRecord’s where.not | thoughtbot
ActiveRecord’s where.not and nil | thoughtbot
How to find records where column is not null or empty in Rails 4 or 5 | Arkency Blog
How do I exclude search results in ActiveRecord? – Stack Overflow
Exclude active record set from another recordset? – Stack Overflow
where における or
参考:
Rails の model で WHERE カラム名 IN [配列] OR カラム名 IN [配列] 検索するメソッドの書き方 – Qiita
where で複数カラムの OR 条件を作成する | 酒と涙とRubyとRailsと
ActiveRecord::Relation を結合する – Qiita
ActiveRecord の #or を使うときは、こう考えると良さそう | nisshiee のブログ
Rails5 の or クエリがバグを誘発しそうで超怖い | モンモンブログ
ActiveRecord::Relation を結合する – Qiita
where で複数カラムの OR 条件を作成する | 酒と涙とRubyとRailsと
ActiveRecord で join と or と and が入り混じった場合 | tail -f pinzo.log
or – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
join したテーブルに or 検索をしたい – teratail
Rails 5 adds OR support in Active Record | BigBinary Blog
OR queries with arrays as arguments in Rails 4 | Coderwall
Combine two ActiveRecord::Relation objects – Stack Overflow
任意の値で探索する/条件を無効化する
参考:
Query ‘any’ value with ‘where’ in Rails – Stack Overflow
id で指定した順序でレコードを取得する
参考:
ActiveRecord で、where で指定した順番通りに結果をソートしたい時どうするか | 日々雑記 (y-yagi.tumblr.com)
How to select database records in an arbitrary order | Justin Weiss
rails の where 句の結果を指定の順番で取り出す方法は? – スタック・オーバーフロー
includes / joins
includes
- N+1 問題を避けるために、必要な関連レコードをまとめてクエリする。
joins
- 関連するモデルの条件で絞り込みを行えるように
INNER JOIN
を実行する。JOIN
して条件を絞り込みたいが、JOIN
するテーブルのデータを使わない場合に使う。
参考:
似ているようで全然違う!? Activerecord における includes と joins の振る舞いまとめ – Qiita
INNER JOIN で eager loading – Qiita
ActiveRecord の joins と preload と includes と eager_load の違い – Qiita
Rails の ActiveRecord による JOIN の挙動について改めて調べてみた | DevelopersIO
関連付けを一括読み込みする | Rails ガイド [公式]
includes – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
joins – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
関連モデルの where で条件を絞り込む
ユーザーがアカウントと関連付けられている場合に、joins
と merge
を使ってアカウントの active
カラムが true
であるユーザーを選択する。
User.joins(:account).merge(Account.where(active: true))
参考:
Rails でアソシエーションされたモデルを条件にして検索する | Workabroad.jp
Rails で複数テーブルの joins/includes と where 検索 | EasyRamble
ActiveRecord の merge は使える子 | mah365
merge – ActiveRecord::SpawnMethods | Ruby on Rails API [Official]
Rails where() clause on model association? – Stack Overflow
merge
参考:
ActiveRecord の merge は使える子 | mah365
merge メソッド使ってます? – Qiita (archive)
ActiveRecord の merge メソッドについて | nakaearth の日記
merge – ActiveRecord::SpawnMethods | Ruby on Rails API [Official]
Combine two ActiveRecord::Relation objects – Stack Overflow
関連付けに条件を付ける
参考:
has_many で関連元のオブジェクトに依存した条件を付けたいとき | falcon’s diary
サブクエリ
参考:
ActiveRecord でサブクエリ (副問い合わせ) と内部結合 – Qiita
SQL でサブクエリを使う | スーパーソフトウエア東京 (archive)
Ruby on Rails で NOT IN な SQL をかく。| そんなこと覚えてない
How i can write a query inside select in rails – Stack Overflow
reset / reload
リレーションをリセットしてクエリを再実行する。
@posts = Post.all @posts.to_a # => Post Load (0.2ms) SELECT "posts".* FROM "posts" @posts.to_a # Reuse cached objects (without executing query) @posts.reset.to_a # => Post Load (0.2ms) SELECT "posts".* FROM "posts"
ユーザーが独自に設定したインスタンス変数はリセットされないので注意。独自に管理する変数をリセットしたい場合はリレーションを拡張して reset
メソッドをオーバーライドする。
参考:
ActiveRecord::Base#reload の使い方 | 珈琲駆動開発
ActiveRecord::Base#reload はインスタンス変数をクリアしない | アクトインディ開発者ブログ
reload | Rails ドキュメント (railsdoc.com)
reset – ActiveRecord::Relation | Ruby on Rails API [Official]
reload – ActiveRecord::Relation | Ruby on Rails API [Official]
How can I know when to “refresh” my model object in Rails? – Stack Overflow
scoping
参考:
scoping – ActiveRecord::Relation | Ruby on Rails API [Official]
select
指定したカラムを取得する。AS
句により別名を付けることができる。
参考:
select – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
AS 句
参考:
カラム名を別名で返したい場合は素直に AS 句を使った方が良いかも 1000件で 380ms 速くなった – Qiita
select alias dosn’t work · Issue #12119 · rails/rails – GitHub
ActiveRecord query alias field name output – Stack Overflow
pluck
参考:
クエリメソッドの select と pluck の違い – GitHub Gist
pluck – ActiveRecord::Calculations | Ruby on Rails API [Official]
distinct
参考:
Collect all values for a given column in an ActiveRecord scope | makandra dev
ids
参考:
ids – ActiveRecord::Calculations | Ruby on Rails API [Official]
count
参考:
size と count と length について | ゆっくりブログ
ActiveRecord の has_many アソシエーションで個数を取得する (size, count, length) | 訳も知らないで
count – ActiveRecord::Calculations | Ruby on Rails API [Official]
count – ActiveRecord::Associations::CollectionProxy | Ruby on Rails API [Official]
IS NULL / IS NOT NULL の書き方
カラムが NULL
のレコードをクエリする。
User.where(name: nil)
カラムが NULL
ではないレコードをクエリする。
User.where.not(name: nil)
参考:
Where 句に NOT NULL を指定する – Qiita
ActiveRecord’s where.not and nil | thoughtbot
How to find records where column is not null or empty in Rails 4 or 5 | Arkency Blog
多段ネストで joins する
参考:
Rails で joins を多段ネストする方法 (親から曾孫まで) – Qiita
複数テーブルにまたがる検索 (先読み、JOIN など) – Qiita
Rails でモデルを4段階 join する方法で、もう一度理解する joins と merge – Qiita
union
UNION
UNION ALL
参考:
ActiveRecord 4.2以上で union する方法 – Qiita
複数の scope の結果をひとつにまとめる方法は? | スタック・オーバーフロー
[wip] Support UNION [ALL] by fatkodima · Pull Request #31658 · rails/rails – GitHub
ActiveRecord UNION left out · Issue #939 · rails/rails – GitHub
use union all in rails – Stack Overflow
none
参考:
none – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
Returning an empty ActiveRecord scope | makandra dev
How to return an empty ActiveRecord relation? – Stack Overflow
クエリオブジェクト
参考:
ActiveRecord の scope を Query object で実装する – Qiita
Money Forward の検索ロジック歴史 – Qiita
extending
参考:
extending – ActiveRecord::QueryMethods | Ruby on Rails API [Official]
extending – rails/query_methods.rb at v6.0.0 · rails/rails – GitHub
to_sql
参考:
to_sql – ActiveRecord::Relation | Ruby on Rails API [Official]
SQL を整形する
参考:
Rails のログに出力されるパラメータや SQL を整形する | ゆるよろ日記
Pretty Print SQL in Ruby – Stack Overflow
ActiveRecord::Base
参考:
rails/base.rb at v6.0.0.rc1 · rails/rails – GitHub
ActiveRecord::QueryMethods
参考:
rails/query_methods.rb at v6.0.0.rc1 · rails/rails – GitHub
ActiveRecord::Querying
参考:
rails/querying.rb at v6.0.0.rc1 · rails/rails – GitHub
ActiveRecord::ConnectionAdapters::Quoting
参考:
ActiveRecord::ConnectionAdapters::Quoting | Ruby on Rails API [Official]
rails/quoting.rb at 5-2-stable · rails/rails – GitHub
current_scope
参考:
current_scope – rails/scoping.rb at v6.0.0 · rails/rails – GitHub
UNIQUE constraint failed エラー
参考:
Sqlite で既に存在するかもしれない primary key を持つ複数 vales を一括 insert | grachro のブログ
SQLite UNIQUE Constraint | SQLite Tutorial (sqlitetutorial.net)
Activerecord の更新のメソッドを使っているのに、id が unique ではない YO と出る。 – スタック・オーバーフロー
SQLite3 UNIQUE constraint failed error – Stack Overflow
update method of ActiveRecord failed because UNIQUE constraint failed: items.id – Stack Overflow
row value misused エラー
参考:
“row value misused” error – Stack Overflow
PpSql
参考:
kvokka/pp_sql: Rails ActiveRecord SQL queries log beautifier – GitHub
anbt-sql-formatter
参考:
sonota88/anbt-sql-formatter: A tool for SQL formatting written in Ruby – GitHub
Niceql
参考:
alekseyl/niceql: niceql gem repo. Nice, colorized SQL formatting in ruby – GitHub
ActiveRecordUnion
参考:
Active Record でシンプルに union を実現する | 東京ブルーライトえんじにあ
active-record-query-trace
クエリがどこから呼び出されたかわかるようにバックトレースをログに出力する。
参考:
OrderAsSpecified
参考:
panorama-ed/order_as_specified: Add arbitrary ordering to ActiveRecord queries – GitHub