После некоторой борьбы с фильтрацией и сортировкой представлений индекса в Rails я в конечном итоге использовал гем Ransack для помощи. В основном это очень здорово, но, кажется, есть небольшое несоответствие между тем, что делает 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» в индексе и по-прежнему возвращать ограниченные результаты поиска, но только для формы? Я пропустил что-то простое?