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
名單由經理提交的所有報告和所有的經理報告的僱員。
我實現了其計算方法如下
- 添加列出所有員工類型報告成一個類的方法employee_categories的方式。例如
['Manager', 'Member']
- 使用上述列表生成所有員工報告到列表。
e.g. Employee.where(:vicepresident_id => 3).where(:type => ['Manager', 'Member'])
- 從#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,而不是去這些長度?