我希望能够创建一个 Ransack::Search 对象以传递给 search_form_for,但是搜索对象的初始创建会查询数据库,这是我不想要的。
我想显示一个带有 Ransack::Search 选项的初始空白表单进行搜索,而不调用数据库。
我怎样才能做到这一点 ?
谢谢,
问候
我希望能够创建一个 Ransack::Search 对象以传递给 search_form_for,但是搜索对象的初始创建会查询数据库,这是我不想要的。
我想显示一个带有 Ransack::Search 选项的初始空白表单进行搜索,而不调用数据库。
我怎样才能做到这一点 ?
谢谢,
问候
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
行尾,否则控制台将打印最后评估的内容,这将导致查询运行!