現在、Railsブロンズ試験を受験してみようと思い、RubyonRails5アプリケーションプログラミングという本で勉強中なので、頭の整理も兼ねて学んだことをまとめてみるφ(..)
今回はモデルの検索について主要なメソッドをまとめてみました・ω・
モデルの検索処理まとめ
主キーによる検索:findメソッド
find
メソッドは、主キーによるレコードの検索を行います。
取得結果は主キー指定の場合はモデルのインスタンス、複数の主キーを指定した場合は、モデルのインスタンスの配列が返却されます。
Model.find(1)
Model.find([1, 2, 3])
任意キーによる検索:find_byメソッド
find_by
メソッドは、任意の項目をキーとして検索を行います。
取得結果として検索条件に合致した最初の一件を返却します。
また複数の検索キーが引数に設定された場合は、複数の検索キー(AND条件)で結果を取得します。
Model.find_by(title: "hoge")
Model.find_by(title: "hoge").find_by(content: "fuga")
基本的な条件式を設定する:whereメソッド
where
メソッドは、引数に条件を設定し、与えられた条件に合致するレコードを返却します。
find_by
メソッドと一見似ていますが、where
メソッドは、条件に合致する全てのレコードを返却します。
また、プレースホルダー?
を使い任意の値を条件式に埋め込むことが出来ます。
※取得結果が1件だったとしてもActiveRecord::Relation
で返却されるため注意が必要です。
madogiwa0124.hatenablog.com
Model.where(title: "hoge", content: "fuga")
Model.where('price >= ?', 1000)
条件に合致しないレコードを検索する:notメソッド
not
メソッドを使うことで、where
メソッドで指定した条件に合致しないレコードを取得することが出来ます。
Model.where.not(title: "hoge")
OR条件で複数条件を設定する:orメソッド
or
メソッドは与えられた条件式をOR条件(または)として加えることが出来ます。
ただし、加えられるのは同一モデルに対するwhere
メソッドのみです。
Model.where(title: "hoge").or(Model.where(content: "fuga"))
取得結果を並び変える:orderメソッド
order
メソッドに項目とソート順を与えることで取得結果の並び替えることが出来ます。
項目とソート順は複数与え、複数項目での並び替えを行うことも可能です。
Model.order(title: :asc)
Model.order(title: :desc)
Model.order(price: :desc, title: :asc)
取得する項目を指定する:selectメソッド
select
メソッドを用いることで特定の項目のみを取得することが出来ます。
引数を複数与えることで、複数の項目を指定することも可能です。
Model.select(:title)
Model.select(:title, :price)
重複したレコードを削除する:distinctメソッド
distinct
メソッドを使うことで取得結果から重複したレコードを削除することが出来ます。
Model.select(:genre).distinct
レコードの取得件数を制御する:limitメソッド・offsetメソッド
limit
メソッドを使用することで最大取得件数を制限することが出来ます。
また、offset
メソッドを使用することで、取得開始位置を指定することが出来ます。
Model.limit(3)
Model.offset(10).limit(10)
データの集計を行う:groupメソッド
group
メソッドを使用することで特定のキーで結果をグルーピングし、データの集計を行うことが出来ます。
Model.select('genre, MAX(price) AS max_price').group(:genre)
集計後の結果に検索条件を設定する:havingメソッド
having
メソッドは、集計後の結果に対して条件を設定し絞込を行うことが出来ます。
Model.select('genre, MAX(price) AS max_price').group(:genre).having('MAX(price) >= ?', 10000)
特定項目の平均値・最小値・最大値・合計値を取得する:averageメソッド・minimumメソッド・maximumメソッド・sumメソッド
平均・最小・最大・合計といった集計でよく使いそうなものは、メソッドとして定義されています。
これらのメソッドはwhere
メソッドに続けて記述することによって、検索結果に適用することも出来ます。
Model.average(:price)
Model.minimum(:price)
Model.maximum(:price)
Model.sum(:price)
Model.where(genre: "hoge").average(:price)
生のSQLを使って検索を行う:find_by_sqlメソッド
どうしても生のSQLで検索を行いたい場合は、find_by_sqlメソッドを使用します。
※SQLの構文はDBMSに依存するためDBMS変更時に不具合を誘発する可能性があるため注意してください。
Model.find_by_sql(['SELECT * FROM models WHERE genre = ?', 'hoge'])
以上です!
また何かあれば追記しようと思いますφ(..)