Ruby on Rails 4.2.6(MySQL)を使用して、
各企業が各登録者のステータスを管理するようなシステムを開発しています。
今回は「自社の管理している登録者の得点をソートする方法」について質問させていただきたいです。
システムの仕様は以下のようになってます。
###システムの仕様
データベース
- 各管理者は必ず企業に所属するようになっています。
- 登録者のステータスは各企業ごとに管理されています。
users - ユーザーテーブル id:integer email:string role:integer members - 登録者テーブル id:integer user_id:integer name:string managers - 管理者テーブル id:integer user_id:integer company_id:integer name:string companies - 企業テーブル id:integer name:string member_statuses - 登録者ステータス id:integer member_id:integer company_id:integer points:integer
ActiveRecordのアソシエーション
class User < ActiveRecord::Base has_one :member has_one :manager end class Member < ActiveRecord::Base belongs_to :user has_many :member_statuses end class Manager < ActiveRecord::Base belongs_to :user belongs_to :company end class Company < ActiveRecord::Base has_many :managers has_many :member_statuses end class MemberStatus < ActiveRecord::Base belongs_to :member belongs_to :company end
###問題点
検索機能はRansackのgemを使用しています。
登録者の得点(points)でソートして一覧表示したいので、
MembersControllerのコードは以下のようになっています。
Ruby
1class MembersController < ApplicationController 2 def index 3 @q = Member.ransack(params[:q]) # params = {"q"=>{"s"=>"member_statuses_points desc"}} 4 @members = @q.result(ditinct: true).includes(:member_statuses) 5 end 6end
こちらのコードでソートして一覧表示すると以下のような結果になってしまい、
企業ID1と企業ID2それぞれが管理する登録者の得点が干渉してしまいます。
[各企業が管理する各登録者の得点] 企業ID1が管理する各登録者の得点:ID1: 0点, ID2: 100点, ID3: 0点, ID4: 0点 企業ID2が管理する各登録者の得点:ID1: 10点, ID2: 0点, ID3: 0点, ID4: 20点 [実際のソート結果] 企業ID1でのソート(降順):ID2, ID4, ID1, ID3 企業ID2でのソート(降順):ID2, ID4, ID1, ID3 [理想のソート結果] 企業ID1でのソート(降順):ID2, ID1, ID3, ID4 企業ID2でのソート(降順):ID4, ID1, ID2, ID3
発行されるSQL
SQL
1SELECT DISTINCT members.id, member_statuses.points FROM members INNER JOIN member_statuses ON member_statuses.member_id = members.id ORDER BY member_statuses.points DESC;
もちろん発行されるSQLを見てもcompany_idは含まれていないので、
この結果になるのは理解できますが、良い解決方法が思い付きません。
もしかしたらデータベースの設計自体もあまり良くないのかもしれませんが、
何かしらアドバイスをいただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。