在自联接中显示层次结构

时间:2013-02-04 20:09:56

标签: ruby-on-rails ruby rails-activerecord

我正在构建一个员工目录应用程序,并且正在使用自联接,因此所有员工关系都在一个表中。

我有下属(direct_reports)显示,我可以显示个人的经理。

这是我的模特:

has_many :direct_reports, :class_name => "Person", :foreign_key => "manager_id"
belongs_to :manager, :class_name => "Person"

以下是我的观点:

<tr><td>Manager:</td><td><strong><%= link_to "Manager", @person.manager %></strong></td></tr>

    <tr><td>Direct Reports:</td><td><strong><% @person.direct_reports.each do |person| %>
                    <%= link_to person.lname + ", " + person.fname, person %><br>
                    <% end %></strong></td></tr>

但是,我还没有找到任何方法来显示组织中上述人员的完整报告层次结构。是的,我正在向经理展示,但我需要向首席执行官展示他们的经理和经理等。

我假设每个人都只有一位经理(在链上)。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

你想要的是一个树状的结构,每个员工都可以有经理,经理也可以有老板等。

试试Ancestry。对此非常有用。您自动获得siblings等范围,以便让所有员工共享同一位经理等。

答案 1 :(得分:1)

没有任何 easy 方法可以使用单个SQL查询(,如评论中所述,Postgres支持此),除非您可以将其限制为预定数量的级别。否则,你可以简单地做一个循环来调用经理的经理,直到你得到一个零结果。

<% manager = @person.manager
while manager do %>
  <tr><td>Manager:</td><td><strong><%= link_to manager.lname + ", " + manager.fname, manager %></strong></td></tr>
<% manager = manager.manager
end %>