Railsの特定のid順で、オーダーをかける方法


概要

Railsの特定のid順で、オーダーをかける方法を記載します。


確認コード

以下のコードで動作を確認しました。

# frozen_string_literal: true

require 'bundler/inline'

gemfile do
source 'https://rubygems.org'

gem 'activerecord', '5.2.3'
gem 'sqlite3'
end

require 'active_record'

ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')

ActiveRecord::Schema.define do
create_table(:articles) do |t|
t.string :content
end
end

class Article < ActiveRecord::Base; end

Article.create!([{ content: '山藍摺' }, { content: '市紅茶' }, { content: '山葵色' }])

article_ids = [3, 1, 2] # このid順で並びかえたい。

p Article.all.sort_by { |article| article_ids.index(article.id) }.map(&:id) # [3, 1, 2]


解説

Active Recordのorderは、使えないのでレコードを取得してからArray#sort_byを使います。


バージョン


  • ruby 2.6.1p33

  • activerecord 5.2.3