我希望能够创建一个Ransack :: Search对象以传递给search_form_for,但是搜索对象的初始创建会查询数据库,我不想要。
我想显示一个带有Ransack :: Search选项的初始空白表单,无需调用数据库即可进行搜索。
我该怎么做?
感谢,
问候
答案 0 :(得分:0)
Arel关系(即查询)在第一次引用结果时被懒惰地执行,因此您应该发现可以创建搜索对象并将其传递给表单,而不会调用数据库,只要您不要在任何地方引用.result方法。
e.g。
// 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
放在行尾,否则控制台将打印最后评估的内容,这将导致查询要运行!