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 %>

しかし、どうすればそれよりも深く行き、友人の友人を見ることができますか?つまり、あるユーザーのプロフィールに移動すると、友人を介して彼の友人を見ることができます。これはレベル 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

まず、これを User モデルに追加して、すべての友達を簡単に取得できます

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 %>

では、なぜこれが機能するのでしょうか。友達も実際には User モデルから来ており、@user と同じメソッドを持っているため、各友達にも friends メソッドがあります。そして、あなたが望まないすべてのネスティングが可能です。そのスクリーンキャストでは、友情を削除するための link_to を作成するための friends_id が必要なため、user.friends の代わりに user.friendships を使用しています。したがって、ユーザー名を表示したいだけの場合は、user.friends を直接使用できます。

なぜこれが悪い習慣になるのでしょうか? 友達ごとに新しいデータベースクエリを作成するため、友達を取得する必要があります。しかし、実際にはそれほど悪くはないかもしれません。キャッシュがあれば、結合クエリは現在のユーザーに固有であり、そのキャッシュはそのユーザーからのみ使用されるため、実際には結合よりも優れているはずです。ユーザーごとに個別のクエリがある場合、すべての友達が他の友達の友達を見るため、それらのキャッシュされたクエリがより多く使用されます。

于 2012-05-24T23:58:18.193 に答える
1

これは実際にはかなり深い問題であり、正しく行うには多少の努力が必要です。チェックアウト:

グラフ エッジ レール

于 2012-05-24T21:35:21.310 に答える