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 

我想要一個方法,列出員工和所有員工報告入鏈的所有報告。因此,例如,(我)vp = Vicepresident.first; vp.all_reports列出了由副總統提交的所有報告,經理向他彙報/她和所有的團隊成員的管理人員報告。 (二)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的員工列表渴望負載報告。 e.g. Employee.where(:vicepresident_id => 3).where(:type => ['Manager', 'Member']).include(:reports)

守則#1,#2,#3這裏顯示 -

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 

我想委派在all_reports排序功能的SQL,而不是紅寶石。我怎麼做?另外,有沒有更簡單的方法來使用表連接來執行all_reports,而不是去這些長度?

回答