在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的所有guest虚拟机的计数仅从过滤后的数据计算。即如果我按rsvp = false过滤,则无论数据库中的实际响应数是多少,rsvp = true的总计数都将为零。有一个简单的方法,即在索引中返回'@guests = Guests.all',并且仍然返回有限的搜索结果,但只是为了表单?我错过了一些简单的东西吗?
答案 0 :(得分:2)
你是对的,@guests
只会返回过滤的guest虚拟机,所以如果你想拥有所有guest虚拟机的rsvp计数,你唯一的选择是在控制器索引方法中添加另一个实例变量:
@guests_count = Guest.where(rsvp: true).count
当然这意味着对数据库的额外查询,您必须确定此计数信息是否足够重要以授予额外的数据库调用。
另一方面:在过滤的访客的上下文中,访问者看到另一个访客rsvp计数可能比实际显示的任务更令人困惑。