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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

3294閲覧

Railsで関連テーブルの値を集計した統計カラムの値によるソート機能を実装する方法について

GenkiSugiyama

総合スコア86

Ruby on Rails 6

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/09/22 08:39

編集2020/09/25 08:32

Userモデル(購入者)→Orderモデル(注文)→Oreder_itemモデル(購入商品)の3つのモデルがあり、左から1対多となるようなリレーションとなっています。

【user.rb】

User.rb

1class User < ApplicationRecord 2 has_many :orders 3456end

【order.rb】

User.rb

1class Order < ApplicationRecord 2 belongs_to :user 3 has_many :order_items 4567end

【order_item.rb】

User.rb

1class OrderItem < ApplicationRecord 2 belongs_to :order 3456end

現在ユーザー一覧画面(views/users/index.html.erb)で累計注文回数(userに紐付くoredersの個数をcount)、累計金額(userに紐付くordersの金額カラム(amount)をsum)、注文個数(userに紐付くordersに紐付くorder_itemsの個数をcount)を表示しているのですが、これらの値を使ってソート機能を実装したいと考えています。

検索機能はgemのransackを使っているのですが、ransackだとテーブルで定義されているカラムのみソート可能ということを目にしたので、何らかの方法で統計カラムでソートを実装する方法をアドバイスいただけると大変助かります。

【users_controllerのindexメソッド】

def index @q = User.where(del_flg: 1).includes(orders: :order_items).ransack(params[:q]) @users = @q.result(distinct: true).order("created_at DESC") end

【usersのindex.html.erb】

<table class="table table-hover table-bordered table-sm"> <div class="d-flex flex-row align-items-center mb-3" > <h1>ユーザー一覧</h1> </div> <%= search_form_for @q, class: "mb-3" do |f| %> <div class="form-group form-inline"> <%= f.label :name_cont, "名前:" %> <%= f.search_field :name_cont, class: "form-control" %> <%= f.submit "検索", class: "btn btn-primary ml-3" %> </div> <% end %> <thead class="thead-light text-center"> <th>ID</th> <th>名前</th> <th>累計依頼回数</th> <th>累計本数</th> <th>累計金額</th> <th>登録日付</th> <th></th> </thead> <% @users.each do |user| %> <% orders = user.orders.where(order_completed: true) %> <% total_items = 0 %> <% amounts = 0 %> <% orders.each do |order| %> <%# 累計本数を取得 %> <% order_items = order.order_items.count %> <% total_items += order_items %> <%# 累計金額を取得 %> <% amounts += order.amount %> <% end %> <tbody class="text-center"> <td class="align-middle"> <%= user.id %> </td> <td class="align-middle"> <%= link_to user_path(user.id), class: "book_#{user.id}", method: :get do %> <%= user.name %> <% end %> </td> <td class="align-middle"> <%= orders.count %>回 </td> <td class="align-middle"><%= total_items.to_s(:delimited) %>本</td> <td class="align-middle text-right"><%= amounts.to_s(:delimited) %>円</td> <td class="align-middle"><%= l user.created_at, format: :very_short %></td> <td class="align-middle"> <%= link_to "詳細", user_path(user.id), class:"btn btn-primary" %> <%= link_to "編集", edit_user_path(user.id), class:"btn btn-success my-3" %> </td> </tbody> <% end %> </table>

よろしくお願いいたします。

2020/09/25 追記
回答に記載いただいたこちらの記事を参考にコントローラー内の処理を変更したところ、発行されたSQL文に関するエラーが表示されました。

【変更内容】

def index @q = User.joins(orders: :order_racket_infos).select("users.id, name, count(orders.id) as orders, sum(orders.amount) as total_amount, count(order_racket_infos.id), users.created_at, kit_shipped_date").where(del_flg: 1).where(orders: { order_completed: true }).ransack(params[:q]) @users = @q.result(distinct: true).order("users.created_at DESC") end

【表示されたエラー】

Mysql2::Error: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'gappari_api2_development.users.id'; this is incompatible with sql_mode=only_full_group_by

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

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

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

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

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

guest

回答2

0

自己解決

新しい質問として投稿するため閉じます

投稿2020/10/07 03:18

GenkiSugiyama

総合スコア86

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

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

0

下記などが参考にならないでしょうか?
https://qiita.com/ayies128/items/2c5596eef388ef92291b

投稿2020/09/22 09:28

no1knows

総合スコア3365

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

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

GenkiSugiyama

2020/09/25 08:29

ありがとうございます。自分もこちらの記事を参考にして対応しようと思ったのですがうまくいきませんでした。。。 具体的にはコントローラー内の記述を下記のように変更したところSQL文に関するエラーが出ました。 ``` @q = User.joins(orders: :order_racket_infos).select("users.id, name, count(orders.id) as orders, sum(orders.amount) as total_amount, count(order_racket_infos.id), users.created_at, kit_shipped_date").where(del_flg: 1).where(orders: { order_completed: true }).ransack(params[:q]) @users = @q.result(distinct: true).order("users.created_at DESC") ``` 出力されたエラー Mysql2::Error: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'gappari_api2_development.users.id'; this is incompatible with sql_mode=only_full_group_by groupメソッドは使っていないはずなのですがgroup_byに関して怒られている?ようです・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問