0

我知道我可以通过调用where()模型来搜索查询,如下所示: Post.where(:title => 'My First Post')

但是,如果我不知道用户是否想过滤掉搜索参数怎么办?例如,我有一个包含可选title字段的搜索表单。如果标题已填写,则表单应搜索标题。但是,如果不是,则表单应该只返回所有字段。

我尝试按照以下方式做一些事情

search = Post.all
if params[:title].present?
   search.where(:title => params[:title])
end

但是,当我调用 Post.all 时,Rails 会立即返回搜索结果,我无法进一步添加条件/

我该怎么做呢?

谢谢!

4

2 回答 2

1

鉴于这里实际上没有太多要链接的关系方式,看起来带有三元运算符的简单单线可能会这样做:

@posts = params[:title].present? ? Post.where(:title => params[:title]) : Post.all

...因为当没有 :where 子句范围时,您以后不能将其链接到 :all,无论如何。

于 2011-01-02T22:59:21.357 回答
1

.all是 arel 的“终结者”方法,并导致实际调用查询(对于.eachand 也是如此.first)。因此,如果您希望能够有条件地继续建立范围,.all那么应该是最后一个调用的东西,如果您想调用它的话。

于 2011-01-02T23:00:05.077 回答