質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

378閲覧

Bookの出版日が新しい順に、Authorを並び替えたい

hir0ki

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

1グッド

1クリップ

投稿2023/01/22 01:16

前提

Ruby on Railsでのモデルの並び替えについてです。

次のように、それぞれの著者が多数の本を出版している関係をモデルに定義しているとします。

ruby

1class Author < ApplicationRecord 2 has_many :books 3end

ruby

1class Book < ApplicationRecord 2end

実現したいこと

Book側に、著書の出版日(published_date)のようなカラムが存在するとして、

ruby

1@authors = Author.all 2 3 4## (例えば)逐次表示したいとき 5@authors.each do |author| 6 p author.name 7 author.books.each do |book| 8 p book.name 9 p book.pulished_date 10 end 11end

などとしてAuthor全体を変数に格納、逐次アクセスするとき、

  • 「各著者の最新のBookの出版日が新しい順に、Authorを並び替えたい」

のですが、こうしたことは可能でしょうか。

例えば

text

1### 太宰治 21. 最新の単行本は1948年11月10日出版の「如是我聞」 32. 次に新しいのは1948年7月25日出版の「人間失格」 4 5### 東野圭吾 61. 最新の単行本は2023年03月17日出版(予定)の「魔女と過ごした七日間」 72. 次に新しいのは2022年11月20日出版の「夢幻花 (上)」 8 9(間違ってたらごめんなさい)

このとき、

  1. 2人のそれぞれの最新著作の出版日(1948年03月17日と2023年11月20日)を比較したとき、2023年の方が新しいので、
  2. @authorsの最初に格納されるデータは「東野圭吾」にしたい

といったことです。(2番目以降の著作の出版日はどうでも良いです)

補足情報(FW/ツールのバージョンなど)

Ruby on rails 7です。
よろしくお願いいたします。

shinoharat👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

includes で関連先テーブルと結合して、降順(DESC)で並び替えれば出来ると思います。

rb

1Author.includes(:books).order("books.published_date" => :desc).to_a

(検証用 ↓)

rb

1# テストデータ作成 2Author.create!(name: "太宰治", books: [ 3 Book.new(name: "如是我聞", published_date: "1948-11-10"), 4 Book.new(name: "人間失格", published_date: "1948-07-25"), 5]) 6 7Author.create!(name: "東野圭吾", books: [ 8 Book.new(name: "魔女と過ごした七日間", published_date: "2023-03-17"), 9 Book.new(name: "夢幻花 (上)", published_date: "2022-11-20"), 10]) 11 12Author.create!(name: "テスト太郎", books: [ 13 Book.new(name: "本1", published_date: "1940-01-01"), 14 Book.new(name: "本2", published_date: "2000-01-01"), 15 Book.new(name: "本3", published_date: "2023-01-01"), 16]) 17 18# 検索 19@authors = Author.includes(:books).order("books.published_date" => :desc).to_a 20 21p @authors.pluck(:name) 22#=> ["東野圭吾", "テスト太郎", "太宰治"]

投稿2023/02/02 07:52

shinoharat

総合スコア1676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問