コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsのActiveRecordのhas_manyにはorderで順番の指定できる

え、こんなコトできるの?っていうやつ。

環境

$ bin/rails -v
Rails 5.2.2

やり方

has_manyのあとにorderをあしらう

has_many :対象モデル, -> { order("order by のあとのSQL文章") }

今回のモデル

# == Schema Information
#
# Table name: users
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class User < ApplicationRecord
  # 名前の順にしたい
  has_many :message, -> { order("name desc") }
  has_one :user_profile
end
# == Schema Information
#
# Table name: messages
#
#  id         :bigint(8)        not null, primary key
#  name       :string(255)
#  user_id    :integer
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Message < ApplicationRecord
  belongs_to :user
end
# userを作って、messageをぶら下げる
user = User.create
# => #<User id: 5, name: nil, created_at: "2019-08-17 07:43:19", 
user.message.build(name:"aaaa")
user.message.build(name:"zzzz")
user.message.build(name:"dddd")
user.save

実際に普通にmessageを取ろうとするとOREDER BYの内容が走る

user.message.each do |mes| pp mes.name end
#  Message Load (1.9ms)  SELECT `messages`.* FROM `messages` WHERE `messages`.`user_id` = 5 ORDER BY name DESC
"zzzz"
"dddd"
"aaaa"

参考リンク