🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2740閲覧

Rails データの並び順を関連付けされたテーブル(messageテーブル)のデータで並べ替える

ko_no

総合スコア16

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/06/23 10:22

編集2020/06/29 02:36

前提・実現したいこと

当方、チャットアプリを作成しております。
画面左にグループ一覧を表示する際に、グループ内の最新メッセージの順番で並べ(LINE等のイメージです)、メッセージが格納されていないグループは一番下に表示させたいです
イメージ説明

発生している問題・エラーメッセージ

Groupコントローラー内でorderを使うところまではわかるのですが、messageテーブルのカラムからデータを取り出す方法がわかりません、、、

テーブルやルーター

userテーブル
groupテーブル
messageテーブル
group_usersテーブル(中間テーブルでuser_idとgroup_idが入っています)
以上4テーブル
groupテーブルとmessageテーブルのリレーションはhas_manyとbelongs_toで繋げてあります!

messageはgroupにネストされております↓

resources :groups do resources :messages end

該当のソースコード

groups_controller.rb↓

def index @groups = Group.includes(:message).order("messages.created_at DESC") binding.pry →=> #<Group::ActiveRecord_Relation:0x3fc419ff6ca8>#何も入っていない?? end

上記のコードで試しましたが、エラーになってしまいます、、、

###エラー文↓
ActiveRecord::ConfigurationError in Groups#index

Showing /Users/kounotakumi/projects/tentyo-chat/app/views/layouts/_group_index.html.erb where line #10 raised:

Can't join 'Group' to association named 'message'; perhaps you misspelled it?→上手くjoinできていない??

Extracted source (around line #10):

8 <% end %> 9 </div> 10 <% groups.each do |group| %> 11 <div class="Main__left__group"> 12 <%= link_to(group_messages_path(group), class: 'Main__left__group-a') do %> 13 <div class="Main__left__group-name">

Trace of template inclusion: #<ActionView::Template app/views/groups/index.html.erb locals=[]>

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

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

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

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

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

guest

回答2

0

ベストアンサー

groupテーブルに対して、messageテーブルを結合(join)してはいかがでしょうか?

before

def index @groups = Group.includes(:message).order("messages.created_at DESC") end

after

def index @groups = Group.includes(:message) @groups = @groups.joins(:messages).order("messages.created_at DESC") end

でエラーメッセージは変わりませんか?

投稿2020/06/30 01:09

shota-imoto

総合スコア37

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

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

ko_no

2020/06/30 02:48

メッセージが投稿されているグループが上手く投稿順に並びました! joinsの使い方がわからず堂々巡りしてましたが、ありがとうございました!!m(_ _)m
guest

0

Group.includes(:message).order('message.created_at' => :desc)

こんなかんじかなー

Grouo.all だと groups table のカラムしか参照できないので
サブテーブルをJOINする必要があります

投稿2020/06/25 16:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問