前提・実現したいこと
お世話になります。
Railsで掲示板を作っています。
スコア順に並び替えたコメントと、それに対するスコア順に並び替えた返信をツリー状に表示したいと考えています。
n-1
n-1-1
n-1-1
n-2
n-2-1
n-3
イメージとしては上記のような、Redditのような形です。
調べてみたところ、ツリー構造の実装には
隣接リストモデル
経路列挙モデル
入れ子集合モデル
閉包テーブルモデル
などがあり、再帰クエリを使えるのなら、ツリー構造には隣接リストが最も適していると
リンク内容
こちらに書いてあり、またSQL文で書いたほうが高速だと
リンク内容
こちらにあったので、MySQLを8.0にアップデートし再帰クエリを用いようと試みました。
しかし初心者のため、SQL文に慣れておらず、またRails内でのSQL文の書き方がわからなかったため、とりあえずRailsの機能で再帰クエリを使おうと、下記のようなコードを書いてみました。
rb
1topics_controller.rb 2@post = @topic.posts.includes(:user).where(parent_post_id: 0).descendents.sort_by{|post| -post.score}
rb
1post.rb 2 has_many :children, foreign_key: :parent_post_id, class_name: 'Post' 3 4 def descendents 5 self.map do |p| 6 p.children.map do |child| 7 [child] + child.descendents 8 end.flatten 9 end 10 end 11
しかしundefined methodのエラーが出てしまいました。
includesを外してみたり、sort_byを外してみたりしたのですが、問題は解決しませんでした。
初心者のため、何か根本的な勘違いをしているのだと思うのですが、それがどこなのかがわかりません。
できればMySQLを用いた再帰クエリの書き方を、MySQLでは難しいのであれば、Railsでの再帰クエリの書き方をご教授いただければ幸いです。またその他の解決法もお待ちしております。
該当のデータ
sql
1+----------------+--------------+------+-----+---------+----------------+ 2| Field | Type | Null | Key | Default | Extra | 3+----------------+--------------+------+-----+---------+----------------+ 4| id | bigint | NO | PRI | NULL | auto_increment | 5| name | varchar(191) | NO | | | | 6| content | text | YES | | NULL | | 7| post_image | varchar(191) | YES | | NULL | | 8| parent_post_id | int | NO | | 0 | | 9| upvotes | int | YES | | 0 | | 10| downvotes | int | YES | | 0 | | 11| user_id | bigint | NO | MUL | NULL | | 12| topic_id | bigint | NO | MUL | NULL | | 13| created_at | datetime | NO | | NULL | | 14| updated_at | datetime | NO | | NULL | | 15| score | int | NO | | 0 | | 16+----------------+--------------+------+-----+---------+----------------+
csv
1Post id, name, content, parent_post_id, score 21,"A","隣接リスト最高!",0,2 32,"B","シンプルでいいですよね",1,0 43,"C","アンチパターンですよ、経路列挙モデル使いましょう",1,2 54,"D","入れ子集合モデルの方が良いですよ",3,1 65,"E","こんにちは",0,0
###望む結果
topic
|_ 隣接リスト最高! 2点
| |_ アンチパターンですよ、経路列挙モデル使いましょう 2点
| |_ 入れ子集合モデルの方が良いですよ 1点
| |_ シンプルでいいですよね 0点
|_ こんにちは 0点
発生している問題・エラーメッセージ
undefined method `descendents' for #<Post::ActiveRecord_AssociationRelation:0x00...
補足情報(FW/ツールのバージョンなど)
mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
Rails 6.0.3.2
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー