え、こんなコトできるの?っていうやつ。
環境
$ 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"