2013-11-10 60 views
1

經過一段時間,在Rails中過濾和排序索引視圖後,我最終使用Ransack gem來協助。大多數情況下它非常棒,但Ransack的做法(至少默認情況下)與我目前正在嘗試做的事情之間似乎略有不同。Rails&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',並且仍然返回有限的搜索結果,但僅限於表單?我錯過了一些簡單的東西嗎

回答

2

你說得對,@guests將只返回過濾的客人,所以,如果你想擁有的所有客人的RSVP計數,你唯一的選擇是添加另一個實例變量在控制器指數方法:

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

當然這意味着對數據庫的額外查詢,並且您必須決定此計數信息是否足夠重要以授予額外的數據庫調用。

另一方面:在過濾客人的情況下,訪問者看到另一個客人rsvp計數可能會比實際顯示的任務混淆。

+0

謝謝約翰。我可能已經過度簡化了上下文,但僅僅添加一個新的實例變量的前提是一種享受。 – grist