2009-01-28 42 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源代码,你应该很清楚它将链接到什么操作。