Как пройти через самореферентную ассоциацию для других ассоциаций? - PullRequest
0 голосов
/ 21 ноября 2010

Я успешно установил референсную ассоциацию дружбы для users в моем приложении Ruby on Rails после того, как следовал railscast Райана Бейтса . Я могу успешно подписаться, отписаться и посмотреть, кто подписан. Теперь я хочу добавить еще один элемент, и я не уверен, как это сделать.

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

Если не требуются дополнительные ассоциации, каков синтаксис в представлении /users/show.html.erb для отображения тренировок для друзей.

UPDATE:

Кажется, основываясь на ответе Джозии Киля, приведенного ниже, я могу подойти ближе. После тестирования в консоли по его совету, я использовал следующий код в представлении:

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

Но, похоже, это возвращает тренировки только для первого пользователя, за которым я следил.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

Вы, вероятно, могли бы сделать что-то вроде этого:

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

Важно отметить, что для того, чтобы это был эффективный запрос к базе данных, вы, вероятно, захотите создать область или ассоциацию, включающую тренировки непосредственно в друзьязапрос.Конечно, вы можете сделать это вручную следующим образом:

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

Проблема с чистыми ассоциациями заключается в том, что у вас было бы несколько: через вызовы, которые не поддерживаются на афаике.Таким образом, он по крайней мере не будет генерировать более двух вызовов дБ.Сначала загрузите идентификаторы друзей, а затем загрузите все тренировки, связанные с любым из них.

0 голосов
/ 21 ноября 2010

У вас есть проблемы, когда вы делаете что-то вроде этого:

a = User.last
a.friends[0].workouts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...