如何为其他关联循环自引用关联?

时间:2010-11-21 06:07:10

标签: ruby-on-rails ruby model

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

如果不需要其他关联,/ users / show.html.erb视图中的语法是什么,以显示朋友的锻炼。

更新:

似乎基于Josiah Kiehl的回答,我能够得到这个结论。根据他的建议在控制台中测试后,我在视图中使用了以下代码:

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

但这似乎只返回我跟随的第一个用户的训练。

2 个答案:

答案 0 :(得分:0)

在做这样的事情时你有问题吗?

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

答案 1 :(得分:0)

你可能会这样做:

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

需要注意的是,要使db查询生效,您可能希望直接在friends查询中创建包含锻炼的范围或关联。你当然可以手动这样做:

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

纯关联的问题在于你会有多个:通过afai不支持的调用。这样它至少不会产生两个以上的db调用。首先加载朋友ID,然后加载与其中任何一个相关的所有锻炼。