2 flat logo on transparent 256
2018-07-08

Ruby On Railsのwhereで値を順序どおりに取得する方法

Search 313211

Ruby On Railsのwhere句はActive Recordのメソッドで、データベースから条件を指定し、条件に当てはまるレコードをすべて取得します。

何かと便利なwhere句ですが、検索値をそのままの順序で表示するには、ちょっとした変更が必要になります。

例えばActive Recordで配列[5,4,3,2,1]で値を検索した場合、出力される値の順序は[1,2,3,4,5] となります。

article_ids =[5,4,3,2,1]
Article.where(id: article_ids).ids

⇛[1,2,3,4,5]

配列の順序通りに、値を出力する場合はSQLのField関数を利用する方法かgemを利用する方法の2通りがあります。

Where句で順序どおりに値を出力する方法:Field関数をする

DBのField関数を利用して対応できます。 以下はMySQLの場合の設定を記載しています。

article_ids =[5,4,3,2,1]
 Article.where(id: article_ids).order("FIELD(id, #{article_ids.join(',')})").ids

⇛[5,4,3,2,1]

コード例はMySQLですがPostgreSQL でも同様の書き方で対応できます。

Where句で順序どおりに値を出力する方法:gemを利用する

gemファイルへorderasspecifiedを追記しインストール

gem 'order_as_specified'

利用したいModelへextendする

class Article
  extend OrderAsSpecified
end

Where句にorderasspecifiedを追記して利用

article_ids =[5,4,3,2,1]
 Article.where(id: article_ids).order_as_specified(id: article_ids).ids

⇛[5,4,3,2,1]

以上

その他関連記事

Ruby On Rails でデータを取得するメソッド一覧

Ruby On Railsでデータベースカラムの追加と削除を行う

Ruby On Railsのscopeメソッドで検索を効率化する

Ruby On Railsのデバッグツール byebugの紹介

ユーザーのフラグ管理に使えるRuby On Railsのenumを紹介

前の記事
次の記事