2012-03-12 63 views
0

我搜索了一個相當簡單的問題,一個可行的解決方案,也沒有找到一個很好的解釋。如何添加列過濾器選項視圖(做「軌道路」)

我目前有(工作)是一個包含索引視圖:

  • 形式進入一個新的元素和
  • (使用will_paginate)現有元素的分頁列表。

因爲我感興趣的數據只是一部分的名單,因此我想以添加一個帶有過濾器的選擇,我想存儲在cookie中的內容形式(這應該與每個被替換用戶對象存儲在數據庫中,但我還沒有用戶)。我無法弄清楚是如何從存儲在cookie中(反之亦然)的形式,以及如何與will_paginated一起使用它得到的值。

我現在試圖做的第一步是建立在我的控制器的@filter對象,並添加過濾器形式的此對象,設置窗體選項再次使用該索引控制器。這導致在params散列中傳遞給索引控制器的選定過濾器參數(在url中可見)。但是這個解決方案有一些缺點。首先,只要我更改視圖(例如通過創建新元素),過濾器就會消失,其次,@filter對象應該是cookie。

這裏是我到目前爲止的代碼:

查看,部分用於過濾器:

<%= form_for(@filter, :url => {:action => "index"}, :html => {:method => :get}) do |f| %> 
    <div class="field"> 
    <%= f.label :german %><br /> 
    <%= f.check_box :german %> 
    </div> 
    <div class="actions"> 
    <%= f.submit "Filter" %> 
    </div> 
<% end %> 

控制器:

def index 
    @word = Word.new 
    @filter = Word.new(params[:word]) 
    @words = Word.paginate(:page => params[:page]).order('word') 
    # .... 

任何人可以幫助我嗎?在其他應用程序中如何完成這樣的功能(過濾結果)?

+0

通過「過濾器」你是否想要一些,但不是所有的數據庫記錄?起初,我以爲你的意思是你只想要一些_columns_。如果第一個,那麼你想使用'where'子句 - 例如'Word.where(「language =?」,params [:language])''。 – 2012-03-14 20:53:18

+0

是的,我想過濾記錄。 – theldoria 2012-03-15 12:12:57

+0

你的提示有一點幫助,我現在有以下行,它適用於複選框:'@words = Word.paginate(:page => params [:page])。order('word')。where(「德語=?「,params [:word] [:german]!=」0「)'。聲明的順序是否重要(例如關於性能)?據我瞭解情況並非如此。 – theldoria 2012-03-15 13:24:40

回答

0

所以,這個問題的答案是,使用where子句只包括在結果的匹配記錄。

@words = Word 
    .where("german = ?", params[:word][:german] != 0") 
    .order('word') 
    .paginate(:page => params[:page]) 

這是一個叫做活動關係(AREL的簡稱)新的Rails語法,一般應更換舊的發現和find_by方法。它有幾個好處,可以提高性能,特別是它執行的SQL(你可以在你的日誌中看到),只有當它被引用時,不是當它被宣佈。這爲您提供了定義部分關係(甚至是命名範圍)的簡潔方法,您可以創建這些關係以創建組合在一起的簡單語句。

的各種條款無關緊要的順序 - AREL會產生相同的SQL,但一般來說,我喜歡跟着下面的SQL語句的順序,

  • 其中
  • 加入
  • 順序
  • 限制
  • 偏移

(LIMIT和OFFSET在您的情況下,通過分頁工具處理)。

+0

我的控制器下面的答案變成:'session [:word] = params [:word] if params [:word]; order('word')和'@words = Word.where(「german =?」,session [:word] [:german]!=「0」 ).paginate(:page => params [:page])''。我使用session來代替cookie(在cookie中存儲散列導致出現錯誤消息)。但這是一個很好的起點...... – theldoria 2012-03-16 14:47:55

+0

我仍然錯過的解決方案是a)更具互動性,b)不污染網址。我想我必須使用AJAX,對吧?用於過濾器表單的對象不應該是Word類,因爲布爾值的過濾器選項爲三態:未選中,爲true和false。在這裏,我可能需要使用一些javascript或css解決方案,或許就像[tristate-checkbox](https://github.com/supernifty/tristate-checkbox) – theldoria 2012-03-16 14:54:14

+0

你可能想問這是一個單獨的問題。 – 2012-03-16 15:20:57

相關問題