我知道我可以通过在模型上调用where()
来搜索查询,如下所示:
Post.where(:title => 'My First Post')
但是,如果我不知道用户是否想要过滤搜索参数怎么办?
例如,我有一个具有可选title
字段的搜索表单。如果标题已填写,表单应搜索标题。但是,如果不是,表单应该只返回所有字段。
我试着按照
的方式做点什么search = Post.all
if params[:title].present?
search.where(:title => params[:title])
end
然而,当我调用Post.all时,Rails会立即返回搜索结果,而我无法再进一步添加条件/
我该怎么做?
谢谢!
答案 0 :(得分:1)
鉴于在这里链接的关系确实没有太多,看起来似乎是一个带有三元运算符的简单单线程可能会这样做:
@posts = params[:title].present? ? Post.where(:title => params[:title]) : Post.all
...因为当没有:where子句范围时,你以后不能将它链接到:all,无论如何。
答案 1 :(得分:1)
.all
是arel的'finisher'方法,可以实际调用查询(同样适用于.each
和.first
)。因此,如果您希望能够有条件地建立范围,.all
应该是最后调用的内容,如果您想要调用它。