Userモデル(購入者)→Orderモデル(注文)→Oreder_itemモデル(購入商品)の3つのモデルがあり、左から1対多となるようなリレーションとなっています。
【user.rb】
User.rb
1class User < ApplicationRecord 2 has_many :orders 3・ 4・ 5・ 6end
【order.rb】
User.rb
1class Order < ApplicationRecord 2 belongs_to :user 3 has_many :order_items 4・ 5・ 6・ 7end
【order_item.rb】
User.rb
1class OrderItem < ApplicationRecord 2 belongs_to :order 3・ 4・ 5・ 6end
現在ユーザー一覧画面(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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。