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


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

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

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

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

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

@reviews = Review.includes(:user)

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

review.user

更重要的是,(这是使用includes的优势(它不会为每次审查触发新的SQL查询,因此您可以避免非常常见的N + 1问题。

您可以在

class Review < ActiveRecord::Base
belongs_to :user
end

然后在视图中

review.user #gives you user

将关联置于审查模型中

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

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

评论用户

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

@reviews = Review.includes(:user)

最新更新