在视图中查找用户对象? Ruby on Rails

时间:2013-12-05 11:16:55

标签: ruby-on-rails ruby

    <% @review.each do |review|%>
    <% if review.host_id == @host.id> 
       <%= @user = User.find(review.user_id) %>
    <% end %>
<% end %>   

所以我有点困惑。我在这里发生了一些事情。我正在循环遍历主机的所有评论,然后检查存储的host.id值是否等于从控制器传递的活动@host对象的id。问题是..现在我需要从评论中存储的用户ID中获取用户对象,但是,我不确定如何做到这一点。我无法从控制器执行此操作,因为所有这些都是在循环中完成的。正如你所看到的,我尝试用上面的代码来做,但我非常怀疑我做得对。请帮我解决这个问题。感谢。

3 个答案:

答案 0 :(得分:1)

您应该在控制器中预加载带有加载评论的用户。首先,您应该belongs_to关联,如下所示:

class Review < ActiveRecord::Base
  belongs_to :user
  # ...
end

然后,在控制器中,您可以使用includes,这样:

@reviews = Review.includes(:user)

现在,对于review关系中的每个@reviews记录,要获得关联用户,您可以调用user方法,如下所示:

review.user

更重要的是,(以及使用includes的优势)它不会为每个评论触发新的SQL查询,因此您可以避免使用N + 1 problem

答案 1 :(得分:0)

你可以在

中建立关系
class Review < ActiveRecord::Base
belongs_to :user
end

然后在视图中

review.user #gives you user

答案 2 :(得分:0)

在评论模型中放置关联

class Review < ActiveRecord::Base

.
.
.
  belongs_to :user
.
.
.

end

放置关联后,您可以使用Review对象直接调用关联来查找用户对象。

review.user

但这会引发N + 1查询问题,因此更好的用户在查找评论时会包含用户,它只会执行两个查询,一个用于查找评论,另一个用于查找用户。

@reviews = Review.includes(:user)