Help us understand the problem. What is going on with this article?

Railsアプリケーションでレコードを任意の順番にソートする

More than 1 year has passed since last update.

RailsアプリケーションでDBから取得したデータを意味を持った順番としてソートしたい時はorderメソッドだけでは対応できないことがあります。

例えば、商品(item)に関連するモデルのステータス定義が以下のようになっているアプリケーションがあるときに、「発売予定」というステータスを追加して、表示順を「発売予定→販売中→売り切れ」にするという対応を行う場合です。

item.rb
class Item < ApplicationRecord
  enum status: {
    on_sale:  0,    # 販売中
    sold_out: 1,    # 売り切れ
  }
end

ステータスの値を直す

そもそもステータスが後ろにしか追加できない設計になっているものがよくないため、enumのvalueを1区切りにせずに最低でも10区切りにして間に差し込めるようにしておくことがより良い実装です。

このようにしておけば「発売予定→販売中→売り切れ」のソートに対応することは容易にできます。

item.rb
class Item < ApplicationRecord
  enum status: {
    plan_to_sell: 5,  # 販売予定
    on_sale:  10,     # 販売中
    sold_out: 20,     # 売り切れ
  }
end

ですが、運用されているサービスを停止せずにこのような変更を行ってしまうとサービスのデプロイの最中に商品が購入されてステータスが変更されてしまったときに不具合が発生してしまう恐れがあります。

Gemを使う

order_as_specifiedというGemを使うと、以下のような定義なら

item.rb
class Item < ApplicationRecord
  extend OrderAsSpecified

  enum status: {
    on_sale:  0,     # 販売中
    sold_out: 1,     # 売り切れ
    plan_to_sell: 2,  # 販売予定
  }
end
Item.order_as_specified(status: [2, 0, 1])

とすることで「発売予定→販売中→売り切れ」に並び替えて取得することができます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away