2009-01-28 32 views
1

當我詢問ActiveScaffold向我展示一個非常長的列表(例如銷售產品列表)時,它會運行數據庫查詢以獲取數據的第一頁並顯示它。如果列表有幾個關係,則此查詢可能需要一些時間才能執行(超過一秒)。大多數時候,我對這個「未過濾」列表不感興趣:我想要做的第一件事是點擊「搜索」並過濾掉這個列表。可以將ActiveScaffold配置爲在顯示列表之前顯示搜索表單嗎?

有什麼辦法,我可以告訴ActiveScaffold 顯示在列表動作被稱爲未過濾的名單?我希望它只顯示搜索表單,等待輸入一些標準,然後只有然後顯示過濾的列表。

回答

1

我通過在控制器限定conditions_for_collection方法找到了解決辦法。這是怎樣的一個黑客攻擊,但其實很簡單(3號線)和它的作品:

def conditions_for_collection 
    params[:action]=="update_table" ? "" : "1=2" 
end 

這是怎麼一回事:當你問的名單,控制器的列表方法被調用,通過ActiveScaffold處理。 ActiveScaffold調用conditions_for_collection,並且由於作用是列表(未update_table),上述返回conditions_for_collection方法「1 = 2」,這當然會導致一個空列表。

用戶可以點擊「搜索」按鈕,並啓動搜索。這將調用update_table行動,再次呼籲ActiveScaffold conditions_for_collection,它這一次返回「」(無過濾器),所以整個列表中查找。

這不是很漂亮,但是它做的不錯。

0

您可能需要覆蓋#index操作並提供您自己的模板。沒有任何辦法可以告訴它不顯示該列表。

事情是這樣的:

active_scaffold :models do |config| 
    config.actions.exclude :index 
end 

你必須然後實現有它自己的模板,等你自己的索引方法。移交給Active Scaffold的搜索行動。我不確定你是怎麼做到的,但是如果你查看原始頁面的HTML源代碼,你應該很清楚它將鏈接到什麼操作。