ActiveRecordで、orderを2回実行した場合の挙動


概要

ActiveRecordで、orderを2回実行した場合の挙動を少し調べました。


確認コード

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

# frozen_string_literal: true

require 'bundler/inline'

gemfile(true) do
source 'https://rubygems.org'

gem 'activerecord', '5.2.1'
gem 'sqlite3'
end

require 'active_record'

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

ActiveRecord::Schema.define do
create_table(:users) do |t|
t.string :name
end
end

class User < ActiveRecord::Base
end

User.create!([{ name: 'alice' }, { name: 'bob' }])

puts User.order(:id).to_sql # SELECT "users".* FROM "users" ORDER BY "users"."id" ASC
puts User.order(:id).order(:name).to_sql # SELECT "users".* FROM "users" ORDER BY "users"."id" ASC, "users"."name" ASC
puts User.order(:id).reorder(:name).to_sql # SELECT "users".* FROM "users" ORDER BY "users"."name" ASC


解説

orderをチェインして使用した場合、第2ソートキーとして扱われることが分かりました。orderを1からやり直したい場合は、reorderを使用すると良いです。


バージョン


  • ruby 2.5.3p105

  • activerecord 5.2.1