Rails & Ransack — вернуть все в индекс

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


person grist    schedule 10.11.2013    source источник


Ответы (1)


Вы правы, @guests вернет только отфильтрованных гостей, поэтому, если вы хотите получить количество rsvp для всех гостей, единственный вариант — добавить еще одну переменную экземпляра в метод индекса контроллера:

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

Конечно, это означает дополнительный запрос к базе данных, и вы должны решить, достаточно ли важна эта информация о подсчете, чтобы предоставить дополнительный вызов БД.

С другой стороны: в контексте отфильтрованных гостей посетителя может сбить с толку то, что он увидит другой счетчик rsvp гостя, чем фактически отображаемые квесты.

person John    schedule 14.11.2013
comment
Спасибо, Джон. Возможно, я слишком упростил контекст, но предпосылка простого добавления новой переменной экземпляра работает. - person grist; 15.11.2013