1

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 でフィルタリングすると、データベース内の true 応答の実際の数に関係なく、rsvp=true の合計カウントはゼロになります。これを回避する簡単な方法はありますか?つまり、インデックスで '@guests = Guests.all' を返し、限定された検索結果も返しますが、フォームのみを返しますか? 簡単なものがありませんか?

4

1 に答える 1

2

そうです@guests、フィルタリングされたゲストのみを返すため、すべてのゲストの rsvp カウントが必要な場合は、コントローラーのインデックス メソッドに別のインスタンス変数を追加するしかありません。

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

もちろん、これはデータベースへの追加のクエリを意味し、このカウント情報が追加の DB 呼び出しを許可するのに十分重要であるかどうかを判断する必要があります。

一方で、フィルタリングされたゲストのコンテキストでは、実際に表示されたクエストよりも別のゲストの rsvp カウントを見ると、訪問者が混乱する可能性があります。

于 2013-11-14T14:24:43.270 に答える