Userモデル(購入者)→Orderモデル(注文)→Oreder_itemモデル(購入商品)の3つのモデルがあり、左から1対多となるようなリレーションとなっています。
【user.rb】
class User < ApplicationRecord has_many :orders def orders_counts orders.where(order_completed: true).count end def order_rackets_counts total_rackets = 0 orders.where(order_completed: true).each do |order| order_rackets = order.order_items.count total_rackets += order_rackets end return total_rackets end def order_amounts amounts = 0 orders.where(order_completed: true).each do |order| amounts += order.amount end return amounts end end
【order.rb】
class Order < ApplicationRecord belongs_to :user has_many :order_items ・ ・ ・ end
【order_item.rb】
class OrderItem < ApplicationRecord belongs_to :order ・ ・ ・ 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"> <%= user.orders_counts %>回 </td> <td class="align-middle"> <%= user.order_items.to_s(:delimited) %>本 </td> <td class="align-middle text-right"> <%= user.order_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>
現在ユーザー一覧画面(views/users/index.html.erb)で累計注文回数(userに紐付くoredersの個数をcount)、累計金額(userに紐付くordersの金額カラム(amount)をsum)、注文個数(「userに紐付くorders」に紐付くorder_itemsの個数をcount)を表示しているのですが、これらの値を使って並び替えたいと考えています。
【controllers/user_controller.rb】
class UsersController < ApplicationController 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 #注文回数により並び替え→注文回数「8回」のデータが1番上に来ていない def order_counts @users = User.joins(orders: :order_items).select("users.id, users.name, count(orders.id) AS order_count, users.created_at, users.kit_shipped_date, count(order_items.id) AS racket_count, sum(orders.amount) AS amounts").group(:user_id).where(del_flg: 1).where(orders: {order_completed: true}).order("order_count desc") end #注文個数により並び替え def racket_counts @users = User.joins(orders: :order_items).select("users.id, users.name, count(orders.id) AS order_count, users.created_at, users.kit_shipped_date, count(order_items.id) AS racket_count, sum(orders.amount) AS amounts").group(:user_id).where(del_flg: 1).where(orders: {order_completed: true}).order("racket_count desc") end #注文金額合計により並び替え def order_amount_counts @users = User.joins(orders: :order_items).select("users.id, users.name, count(orders.id) AS order_count, users.created_at, users.kit_shipped_date, count(order_items.id) AS racket_count, sum(orders.amount) AS amounts").group(:user_id).where(del_flg: 1).where(orders: {order_completed: true}).order("amounts desc") end end
上記のようにメソッドを分け、ルーティングで設定したそれぞれのURLにアクセスすると並び替えが実行されるようになっています。
上記の状態でブラウザで並び替え状況を確認したところ、「注文個数」による並び替えは上手く動いているように見えますが、その他2つの処理はバラバラになっております。
【order_counts.html.erb】注文回数による並び替え
【racket_counts.html.erb】注文個数による並び替え
【order_amount_counts.html.erb】注文回数による並び替え
上手く個数をカウントし意図した並び替えを実現するためのアドバイスをいただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー