2010-11-21 5 views
0

Ryan Bates' railscastの後に私のRuby on Railsアプリでusersの友人自己参照関係を設定しました。私は首尾よくフォロー、アンフォロー、そして誰がフォローしているかを見ることができます。今私は別の要素を取り入れたいと思うし、それをどうやって行うのか分からない。他の関連付けのための自己参照関連付けをどのようにループするのですか?

User has_many :workouts 

私が従うユーザーのワークアウトを表示したいと思います。 Twitterのようなものは、あなたのフォローしているユーザーのツイートを表示します。これは、私の下の団体与えられたか、私は別のものを設定する必要があります、例えば、ここで

Friendship has_many :workouts, :through => :users. 

はあなたが必要な場合がありますモデル情報の残りの部分で行うことができます。

User.rb

has_many :friendships 
    has_many :friends, :through => :friendships 
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id" 
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user 
    has_many :workouts, :dependent => :destroy 

Friendship.rb

belongs_to :user 
    belongs_to :friend, :class_name => "User" 

Workout.rb

belongs_to :user 

ない追加の関連付けが必要な場合は、/ユーザ/ショーで構文ものです.html.erbビューを使用して、友人のワークアウトを表示します。

UPDATE:

それは私がこの近くを取得することができる午前以下ジョサイアキールズからの回答に基づいているようです。彼のアドバイスあたりのコンソールでテストした後、私は、ビューに次のコードを使用:

<% current_user.friends[0].workouts.each do |workout| %> 
    <%= workout.title %><br/> 
<% end %> 

をしかし、これは私が続く最初のユーザーのためのトレーニングを返すようです。

答えて

0

をあなたはおそらくこのような何か行うことができます:注意することが重要

<% current_user.friends.each do |friend| %> 
<h1><%= friend.name %></h1> 
<% friend.workouts.each do |workout| %> 
<p><%= workout.title %></p> 
<% end %> 
<% end %> 

あなたは、このための効果的なDBクエリすることです友人クエリに直接ワークアウトを含むスコープや関連付けを作成したいと思うかもしれません。もちろん、このように手動で行うことができます:

<% current_user.friends.all(:include => :workouts).each do |friend| %> 

編集:あなたはCURRENT_USERと直接の友人のワークアウトを関連付けたい場合は

は、私が最も簡単な方法は、関連付けるためのマニュアルの方法を作成することだと思いますトレーニング。

def friends_workouts 
    @friends_workouts ||= Workout.find_all_by_friend_id(self.friends.map(&:id), :order => "created_at DESC") 
end 

純粋なアソシエーションの問題は、afaikをサポートしていない複数の通話があることです。この方法では、少なくとも2回以上のdbコールを生成しません。最初に友だちIDを読み込み、その中のいずれかに関連付けられたすべてのワークアウトを読み込みます。

+0

私はすべての友人のワークアウトを1つのストリームに統合したいと考えていました。コードの最初のビットは、友達のリストを表示するために働き、私が2番目のコードを使用するときは、 '未定義のメソッドfor workout'というエラーが出ます。 – bgadoci

+0

より具体的には、エラーは次のようになります:# ' – bgadoci

+0

のための '未定義メソッド' workout'また...私はワークアウトを表示する必要があります:order => "created_at DESC" – bgadoci

0

あなたはこのような何かやってたときに問題を抱えている:

a = User.last 
a.friends[0].workouts 
+0

Nilのために 'NoMethodError:undefined method 'workouts'を取得しました:NilClass – bgadoci

+0

実際に私が上記のようにしたとき、最初はうまくいくように見えました...これを呼び出すための正しい構文は何でしょうか? – bgadoci

+0

私の質問が更新されました。 – bgadoci

関連する問題