0

私はSTIとhas_many関係を設定しています。従業員チームは、以下に示すように単一のテーブル継承を使用してデータベースに構築されます。単一テーブル継承、has_manyリレーションシップとソート

class Employee < ActiveRecord::Base 
    has_many :reports 
    #More code goes here. Scroll down for details 
end 

class Vicepresident < Employee 
    has_many :managers 
    has_many :members 
end 

class Manager < Employee 
    has_many :members 
    belongs_to :vicepresident 
end 

class Member < Employee 
    belongs_to :manager 
    belongs_to :vicepresident 
end 

従業員とすべての従業員がチェーンに報告したすべてのレポートをリストする方法が必要です。たとえば、(i)vp = Vicepresident.first; vp.all_reportsには、副社長、マネージャーに報告するマネージャー、およびマネージャーに報告するすべてのチームメンバーが提出したすべてのレポートがリストされます。 (ii)mgr = Manager.first; mgr.all_reportsには、マネージャとマネージャに報告したすべての従業員によって提出されたすべてのレポートがリストされます。

  1. はに報告し、すべての従業員のタイプを示していますクラスメソッドemployee_categoriesを追加し、次のように私はそれを実装する方法があります。例えば['Manager', 'Member']
  2. 上記のリストを使用して、従業員のすべてのリストを生成してください。 e.g. Employee.where(:vicepresident_id => 3).where(:type => ['Manager', 'Member'])
  3. #2の従業員リストの熱心な負荷レポート。ここに示した#1、#2、#3のためのe.g. Employee.where(:vicepresident_id => 3).where(:type => ['Manager', 'Member']).include(:reports)

コード -

class Employee < ActiveRecord::Base 
    has_many :reports 

    def self.employee_categories 
     self.reflect_on_all_associations(:has_many) 
     .reject{|a| a.active_record.superclass.name != "Employee"} 
     .collect {|a| a.name.to_s.singularize.capitalize} 
    end 

    def team_members 
     id = self.class.name.downcase + "_id" 
     Employee.where(id => self.id).where(:type => self.class.employee_categories) 
    end 

    def all_reports 
     reports = [] 

     self.team_members.include(:reports).each do |emp| 
     reports << emp.reports 
     end 

     return reports.flatten.sort {|x,y| y.created_at <=> x.created_at} 
    end 
end 

私はSQLの代わりに、ルビーにall_reportsでソート機能を委任します。それ、どうやったら出来るの?また、これらの長さに行くのではなく、テーブル結合を使用してall_reportsを実行する簡単な方法がありますか?

答えて

関連する問題