0

基于本教程

自指关联

http://railscasts.com/episodes/163-self-referential-association

我们可以看到我们添加的朋友,还可以使用以下代码转到用户的个人资料并查看他的朋友:

  <% for friendship in @user.friendships %>
     <%= friendship.friend.username %>
  <% end %>

  <% for user in @user.inverse_friends %>
    <li><%= user.username %></li>
  <% end %>

但是我怎样才能更深入地看到一个朋友的朋友,我的意思是如果你去一个用户的个人资料,你可以通过 friensips 看到他的朋友,这是 1 级,我怎么能看到他朋友的朋友同一页,有可能吗?

我给出的这个是 railscasts 的例子,因为我的应用程序工作相同,我需要更深入,因为我需要制作 jqueryChart 并且我需要更多分支,为了拥有更多分支,我需要获取用户朋友之间的关系和他朋友的朋友(伙计,这很难)。非常感谢你。

                                         User
level 1         user.friend 1            user.friend 2                user.friend 3
level 2    friend 4 of user.friend 1     friend 1 of user.friend 2
level 3    friend 5 of friend 4

所以这可能会让它更清楚,我怎样才能至少在同一个用户页面上达到第 2 级?

4

2 回答 2

3

首先,您可以将其添加到您的用户模型中,以便更容易获得所有朋友

has_many :friends, :through => friendships

所以你现在可以做

<% for friend in @user.friends %>
  <%=friend.username %>
<% end %>

代替

<% for friendship in @user.friendships %>
  <%= friendship.friend.username %>
<% end %>

并使用每种方法

<% @user.friends.each do |friend| %>
  <%=friend.username %>
<% end %>

所以,我认为这解决了你的问题,但它不是一个很好的生产解决方案。

<% @user.friends.each do |friend| %>
  <%=friend.username %>
  <%= friend.friends.each do |fof| %>
    <ul>
      <li><%= fof.username %></li>
    </ul>
  <% end %>
<% end %>

那么,为什么这有效?因为friends其实也是来自User模型,和@user有同样的方法,所以每个朋友身上也有friends方法。你可以做所有你不想要的嵌套。在那个截屏视频中,他使用 user.friendships 而不是 user.friends 只是因为他需要friendship_id 来创建link_to 来删除友谊。因此,如果您只想显示用户名,可以直接使用 user.friends。

为什么这可能是一个不好的做法?因为您为每个朋友创建了一个新的数据库查询,所以您必须得到他们的朋友。但也许它实际上并没有那么糟糕,如果有一些缓存,这些查询实际上应该比连接更好,因为连接查询对于当前用户来说是唯一的,并且它的缓存将只从他那里使用,如果每个用户都有一个单独的查询,那么这些缓存的查询将被使用更多次,因为所有朋友都会看到其他朋友的朋友。

于 2012-05-24T23:58:18.193 回答
1

这实际上是一个相当深的问题,要正确地做到这一点需要付出一些努力。查看:

图形边缘导轨

于 2012-05-24T21:35:21.310 回答