1

我希望能够创建一个 Ransack::Search 对象以传递给 search_form_for,但是搜索对象的初始创建会查询数据库,这是我不想要的。

我想显示一个带有 Ransack::Search 选项的初始空白表单进行搜索,而不调用数据库。

我怎样才能做到这一点 ?

谢谢,

问候

4

1 回答 1

0

Arel 关系(即查询)在第一次引用结果时延迟执行,因此您应该发现您可以创建一个搜索对象并将其传递给表单,而无需调用数据库,只要您不引用.result 方法在任何地方。

例如

// in your controller
my_query = MyModelClass.where{ id.gt(0) }
@q = my_query.search( params[:q] )

// in your view
search_form_for( @q, (...other options...) )

其中任何一个都将触发实际执行的 db 查询:

- @q.results.each do |result| 
- for result in @q.results
- @q.results.count
- @q.results.to_a
- @q.results.size
// ....etc

但只要您只为表单使用搜索对象,它就不会被执行。

当然,如果您是从控制台测试,请确保将其放在;nil行尾,否则控制台将打印最后评估的内容,这将导致查询运行!

于 2013-08-07T12:02:20.517 回答