직원과 직원이 작성한 보고서간에 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를 추가
- 를 다음과 같이이 구현되는 방법. 예 :
['Manager', 'Member']
- 위에 나열된 목록을 사용하여 직원로 모두의 목록을 생성하십시오.
e.g. Employee.where(:vicepresident_id => 3).where(:type => ['Manager', 'Member'])
- # 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를 수행하는 더 간단한 방법이 있습니까?