访问协会的关联

时间:2013-10-08 18:39:18

标签: ruby-on-rails

我有一个Rails应用程序,其用户模型设置了这样的朋友关系

User.rb

has_many :friendships
has_many :friends, :through => :friendships

每个用户与Recipe.rb模型的关联has_many

在我的应用中,我想要由该用户的朋友在用户的节目页面上发布食谱。即通过朋友协会获取朋友的食谱。因此,我在users_controller.rb中执行此操作

def show 
  @friend_recipes = []
  @user.friendships.each do |friendship|
    @friend_recipes << User.recipes_by_friends(friendship.friend_id)
  end 
end

在用户模型上调用类方法recipes_by_friends

User.rb

scope :recipes_by_friends, lambda { |friend_id|
  joins(:recipes).
  where(recipes: {user_id: friend_id})     
}

在用户显示页面中,我尝试显示每个食谱。但是,在下面的代码中,配方局部变量实际上是朋友的活动记录关系,而不是朋友的配方。

/views/users/show.html.erb

<% @friend_recipes.each do |recipe| %></li> 
  <%= recipe.inspect %>  ## this is the relation for the user, not the recipe 
<% end %> 
  1. 我应该如何更改用户模型中的范围方法(或更改其他内容?)以获取配方?

  2. 这是循环播放朋友并将其食谱添加到数组的最佳方法吗?

    @user.friendships.each do |friend|
      @friend_recipes << User.recipes_by_friends(friend.friend_id)
    end
    

1 个答案:

答案 0 :(得分:2)

在这种情况下,我相信你可以让ActiveRecord为你做咕噜咕噜的工作。

<强> user.rb

has_many :friend_recipes, :through => :friends, :source => :recipes

<强> users_controller.rb

def show 
  @friend_recipes = @user.friend_recipes 
end

由此生成的实际SQL查询将是:

2.0.0p247 :001 > user = User.first
2.0.0p247 :002 > user.friend_recipes
  Recipe Load (1.7ms)  SELECT "recipes".* FROM "recipes" INNER JOIN "friends" ON "recipes"."friend_id" = "friends"."id" INNER JOIN "friendships" ON "friends"."id" = "friendships"."friend_id" WHERE "friendships"."user_id" = ?  [["user_id", 1]]