2010-11-21 2 views
0

Ryan Bates' railscast 다음에 Ruby on Rails 앱에서 users에 대한 우정 자체 참조 연결을 성공적으로 설정했습니다. 내가 팔로우하고있는 사람을 성공적으로 팔로우, 언 폴링 및 볼 수 있습니다. 이제 다른 요소를 가져와서 어떻게해야할지 모르겠다.다른 연결에 대해 자체 참조 연결을 어떻게 루프합니까?

User has_many :workouts 

내가 따르고있는 사용자의 운동을 표시하고 싶습니다. 트위터와 같은 종류의 사용자는 내가 팔로우하는 사용자의 트윗을 표시합니다. 이 여기

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

을하지만 이것은 단지 내가 다음에 첫 번째 사용자를 위해 운동을 반환 할 것으로 보인다. 당신은 아마 이런 식으로 뭔가 할 수

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

답변

0

: 이런 식으로 뭔가를 할 때

+0

나는 모든 친구들의 운동을 하나의 흐름으로 통합하기를 원했다. 첫 번째 코드는 친구들의 운동 목록을 표시하는 데 사용되며, 두 번째 코드를 사용하면 '정의되지 않은 운동 방법'오류가 발생합니다. – bgadoci

+0

오류가 구체적으로 : 번호'정의되지 않은 메서드'운동을 '<사용자 : 0x1048d8e70>' – bgadoci

+0

또한 ... 나는 운동이 필요 표시 : 순서 => "DESC created_at" – bgadoci

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와 직접 친구의 운동을 연결할 경우

, 내가 가장 쉬운 방법은 연결하는 수동 방법을 만드는 것입니다 생각 운동. AFAIK 지원되지 않는 호출을 통해 순수한 협회와

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

문제 는 여러했을 것입니다. 이 방법은 적어도 두 개 이상의 db 호출을 생성하지 않습니다. 먼저 친구 아이디를로드하고 그 중 하나와 관련된 모든 운동을로드합니다.

+0

'NoMethodError : undefined method 'workouts'for nil : NilClass – bgadoci

+0

실제로 사용자가 위와 같은 작업을 수행했을 때 처음에는 작동하는 것처럼 보였습니다 ... 이것을 호출하기위한 올바른 구문은 무엇입니까? – bgadoci

+0

내 질문이 업데이트되었습니다. – bgadoci