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은 관리자와 관리자에게보고하는 모든 직원이 제출 한 모든 보고서를 나열합니다.

난에보고 모든 직원 유형을 나열하는 클래스 메소드의 employee_categories를 추가

  1. 를 다음과 같이이 구현되는 방법. 예 : ['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를 수행하는 더 간단한 방법이 있습니까?

답변