在 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 %>
但这似乎只返回我跟随的第一个用户的训练。
答案 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,然后加载与其中任何一个相关的所有锻炼。