1

经过一段时间在 Rails 中过滤和排序索引视图后,我最终使用 Ransack gem 来提供帮助。大多数情况下,它非常棒,但 Ransack 所做的(至少默认情况下)与我目前正在尝试做的似乎略有脱节。

我真正想要做的只是将过滤器应用于表单以显示索引上的数据,以及与索引视图相关的其他摘要数据(例如总计等)。但是,据我了解,通过 Ransack 进行的搜索或过滤操作实际上会过滤所有条目,然后索引视图仅响应那些过滤的项目,即索引只会返回新过滤的数据。因此,我似乎无法在与过滤数据相同的视图中返回完整的、未过滤的设置值。下面是一个简化的示例,用于响应参加功能的客人(“rsvp”作为布尔值):

控制器:

def index
  @search = Guest.search(params[:q])
  @guests = @search.result
end

看法:

<td><%= @guests.where(rsvp: true).count %></td>

  <%= search_form_for @search do |f| %>
  <div class="dropdownlist span2">
    <%= f.select :rsvp_eq, options_for_select([['All Guests', ''],['Confirmed attending', true], ['Not attending', false]], :selected => :wedding) %>
    <%= f.submit "Filter" %>
  </div>
  <% end %>
</div>
<table class="table">
  <tr>
    <th>Guest</th>
  </tr>
  <% @guests.each do |b| %> 
  <tr>
    <td><%= b.name %></td>
  </tr>
  <% end %>
</table>

在此示例中,过滤器有效地工作,但 rsvp=true 的所有客人的计数仅从过滤后的数据中计算。即,如果我按 rsvp=false 过滤,则 rsvp=true 的总计数将为零,而不管数据库中真实响应的实际数量如何。有没有一种简单的方法可以解决这个问题,即在索引中返回'@guests = Guest.all',并且仍然返回有限的搜索结果,但只是针对表单?我错过了一些简单的东西吗?

4

1 回答 1

2

你是对的,@guests将只返回过滤的客人,所以如果你想拥有所有客人的 rsvp 计数,你唯一的选择是在控制器索引方法中添加另一个实例变量:

@guests_count = Guest.where(rsvp: true).count

当然,这意味着对数据库的额外查询,您必须确定此计数信息是否足够重要以授予额外的数据库调用。

另一方面:在过滤客人的情况下,访问者看到另一个客人的 rsvp 计数而不是实际显示的任务可能会让人感到困惑。

于 2013-11-14T14:24:43.270 回答