在不查询DB的情况下创建Ransack对象

时间:2012-08-29 16:15:37

标签: ruby-on-rails-3 ransack

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

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

我该怎么做?

感谢,

问候

1 个答案:

答案 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放在行尾,否则控制台将打印最后评估的内容,这将导致查询要运行!