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

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

ただいまの
回答率

89.55%

railsで関連テーブルの合計値順で一覧表示したい

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 58

yuta66jp

score 4

前提・実現したいこと

ユーザー一覧ページに保有ポイントの合計値が多い順に表示したいです。
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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる