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

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

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

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

Q&A

解決済

1回答

689閲覧

railsのソート機能で合計値がうまく認識しない

yuta66jp

総合スコア11

Ruby on Rails

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

0グッド

1クリップ

投稿2020/04/18 10:12

前提・実現したいこと

railsでポートフォリオを作成致しました。
そこにいくつかのサイトを参考にソート機能を追加致しましたが、フォロワー数の多い順を選択した際に二人までは降順で表示されますが、一人が認識されず、0人と混ざって表示されます。
日記投稿数と同じコードの記載で日記投稿数は上手く機能しておりますが、フォロワー数が機能しません。
ご教示頂けますでしょうか。

該当のソースコード

def index # ソート機能分岐 if params[:sort] == "point" @users = User.order(total_point: "DESC").page(params[:page]) elsif params[:sort] == "diary" @users = User.joins("left join diaries on diaries.user_id = users.id").group(:id).order("count(*) desc").page(params[:page]) elsif params[:sort] == "follower" @users = User.joins("left join relationships on followed_id = users.id").group(:id).order("count(*) desc").page(params[:page]) else @users = User.page(params[:page]).reverse_order end end
<div class="main container"> <%= form_with(url: users_path, method: :get, local: true) do |f| %> <%= select_tag("sort", options_for_select({登録の新しい順: "new", 取得ポイントの多い順: "point", 日記投稿数の多い順: "diary", フォロワーの多い順: "follower"}), include_blank: "並び替え")%> <%= f.submit "並び替え" %> <% end %>
class Relationship < ApplicationRecord # アソシエーション設定 # class_nameを使用し関連名からモデル名を推定できない場合、参照先(モデル名)を指定する # 擬似的にfollowerモデル,followedモデルを作る belongs_to :follower, class_name: "User" belongs_to :followed, class_name: "User" end
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable #自分がフォローしている人 # フォローする側のUser(="follower_id")からみてフォローされるUserを中間テーブル(follower)を介して集める has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy # フォロー取得 # 中間テーブル(follower)を通して(through)、followedモデル(source)のUser(フォローされた側)を集めることをfollowing_userと定義する has_many :following_user, through: :follower, source: :followed #自分をフォローしている人 # フォローされる側のUser(="followed_id")からみてフォローしてくるUserを中間テーブル(followed)を介して集める has_many :followed, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy # フォロワー取得 # 中間テーブル(followed)を通して(through)、followerモデル(source)のUser(フォローする側)を集めることをfollower_userと定義する has_many :follower_user, through: :followed, source: :follower # フォローする・フォロー外す・フォローしているか確認を行うメソッドの定義 # フォローする def follow(user_id) follower.create(followed_id: user_id) end # フォローを外す def unfollow(user_id) follower.find_by(followed_id: user_id).destroy end # フォローしているか確認(フォローしてればtrueを返す) def following?(user) following_user.include?(user) end end

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

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

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

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

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

no1knows

2020/04/18 11:44

ここまでご自身で実装されているなら、一度、実行されたSQL文を確認することをおすすめします。
yuta66jp

2020/04/18 13:10

回答頂きありがとうございます。 確認致しましたが、SQL文の理解ができておらずわかりません。 User Load (1.2ms) SELECT "users".* FROM "users" left join diaries on diaries.user_id = users.id GROUP BY "users"."id" ORDER BY count(*) desc LIMIT ? OFFSET ? [["LIMIT", 12], ["OFFSET", 0]] こちらの記載ですが分かりますでしょうか。
guest

回答1

0

自己解決

下記のように修正することで意図した状態で表示できました。
ただ、どのような文なのか理解できていないので勉強致します。

@users = User.joins("left join relationships on followed_id = users.id").group(:id).order("count(followed_id) desc").page(params[:page])

投稿2020/04/19 02:31

yuta66jp

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問