前提・実現したいこと
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
ここまでご自身で実装されているなら、一度、実行されたSQL文を確認することをおすすめします。
回答頂きありがとうございます。
確認致しましたが、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]]
こちらの記載ですが分かりますでしょうか。
回答1件
あなたの回答
tips
プレビュー