Ruby on rails 如何显示<;p>;在rails html.erb中,若每个条件中的任何一个都为真,则仅此一次

Ruby on rails 如何显示<;p>;在rails html.erb中,若每个条件中的任何一个都为真,则仅此一次,ruby-on-rails,ruby,each,Ruby On Rails,Ruby,Each,在my html.erb文件中: <% @user.relationships.each do |relationship| %> <% if relationship.status == "requested" %> <p>You have friend requests from: </p> <%= User.find(relationship.followed_id).name %> 您的好友请求来自:

在my html.erb文件中:

<% @user.relationships.each do |relationship| %>
  <% if relationship.status == "requested" %>
    <p>You have friend requests from: </p> 
    <%= User.find(relationship.followed_id).name %>

您的好友请求来自:


问题是,如果有匹配项,我只想显示一次您的好友请求:

,而当前它每次都显示一次status==“requested”

我建议如下:

<% requested = @user.relationships.where(status: 'requested') %>
<% if requested.any? %>
  <p>You have friend requests from: </p> 
  <% requested.each do |relationship| %>
    <%= User.find(relationship.followed_id).name %>

您的好友请求来自:


因为您似乎加载了所有对象,所以让我们在ruby中这样做,否则这应该使用作用域来完成

在您的模型中:

def requested?
  status == 'requested'
end
在控制器中:

@relationships = @user.relationships.includes(:followed)
@requested_relationships = @relationships.select &:requested?
在你看来:

<% if @requested_relationships.any? %>
  <p>You have friend requests from: </p> 
    <% @requested_relationships.each do |relationship| %>
       <%= relationship.followed.name %>

您的好友请求来自:



编辑以防止n+1查询

您应该创建不在中的范围的范围。作用域看起来更像:
scope:requested,->{where(status:'requested')}
它仍然不是作用域。在ActiveRecord关系上调用
#select
时,它会将每个记录作为ActiveRecord实例数组加载到内存中。使用上面我的建议这样的作用域会延迟加载记录。再次阅读我的答案,我明确地说我在ruby中这样做,因为op似乎想要所有关系,行不需要在each循环之外吗?哦,我想你需要将ser.relations.each do | relationship |更改为@requested|relationships.each。。。也许我没有指定我只想迭代状态为“requested”的关系