经过一段时间在 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',并且仍然返回有限的搜索结果,但只是针对表单?我错过了一些简单的东西吗?