前提・実現したいこと
ユーザー一覧ページに保有ポイントの合計値が多い順に表示したいです。
pointはuserと別のテーブルでrewardsテーブルにpointカラムとしてあります。
関連テーブルのカラムの合計値順に表示することは可能でしょうか。
お願い致します。
発生している問題・エラーメッセージ
いくつかのサイトを参考にし試してみましたがエラーになります。
ActiveRecord::StatementInvalid in Users#index SQLite3::SQLException: misuse of aggregate: sum(): SELECT DISTINCT "users"."id" FROM "users" LEFT OUTER JOIN "rewards" ON "rewards"."user_id" = "users"."id" ORDER BY sum(rewards.point) LIMIT ? OFFSET ?
該当のソースコード
class UsersController < ApplicationController # ログイン済みユーザーにのみアクセスを許可する(deviseのメソッド) before_action :authenticate_user!, except: [:index, :show] before_action :correct_user, only: [:edit, :update] def index #@users = User.all @users = User.eager_load(:rewards).order("sum(rewards.point)").page(params[:page]) end
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable # attachmentメソッド(gem:refile)使用 attachment :profile_image # アソシエーション設定 has_many :diaries, dependent: :destroy has_many :body_weights, dependent: :destroy has_many :rewards, dependent: :destroy has_many :diary_comments, dependent: :destroy
class Reward < ApplicationRecord # アソシエーション設定 belongs_to :user # バリデーション設定 # numericalityは属性に数値のみが使われているか検証(デフォルトでnillは弾く) # only_integerで整数のみを許可 validates :point, numericality: { only_integer: true } validates :issue_reason, presence: true # enum機能の定義 enum issue_reason: { 新規登録: 0, ログイン: 1, 日記投稿:2, フォロー: 3, 目標達成: 4 } # point(定数)の定義 Point = [30, 5, 10, 10, 100] # 取得ポイントの合計値を計算 def self.total_point self.all.sum(:point) end # ポイント取得メソッドの定義 def self.give_point(user,reason) create( user_id: user.id, point: Point[reason], issue_reason: reason ) end
<div class="row"> <% users.each do |user| %> <div class="col-xs-3"> <div class="user-index center"> <%= link_to user_path(user) do %> <%= attachment_image_tag user, :profile_image, size: "100x100", class: "img-circle", fallback: "no_image.jpg" %><br> <%= user.name %> <% end %> <p>フォロー:<%= link_to user.follower.count, user_relationships_path(user_id: user.id, index: "follower") %></p> <p>フォロワー:<%= link_to user.followed.count, user_relationships_path(user_id: user.id, index: "followed") %></p> </p> <p><%= user.rank_status %>(<%= user.rewards.total_point %>point)</p> <% if user.public_status == "公開" %> <p>身長<%= user.height %>cm</p> <p>目標体重<%= user.goal_weight %>kg</p> <% else %> <p>身長:非公開</p> <p>目標体重:非公開</p> <% end %> <p>日記投稿数:<%= link_to user.diaries.count, diaries_path(index: "user", id: user.id) %>件</p> <% if user_signed_in? %> <% if current_user != user %> <% if current_user.following?(user) %> <%= link_to "フォローを外す", user_relationships_path(user.id), { method: :delete, class: "btn btn-danger" } %> <% else %> <%= link_to "フォローする", user_relationships_path(user.id), { method: :POST, class: "btn btn-success" } %> <% end %> <% end %> <% end %> </div> </div> <% end %> </div> <div class="center"> <%= paginate users, class: "paginate" %> </div>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/09 11:21
2020/04/09 23:03