Rails& Ransack - 返回所有索引

时间:2013-11-10 07:54:39

标签: ruby-on-rails ransack

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

1 个答案:

答案 0 :(得分:2)

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

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

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

另一方面:在过滤的访客的上下文中,访问者看到另一个访客rsvp计数可能比实际显示的任务更令人困惑。