0

我是新来的轨道。以下是以 Foo 作为模型对象的代码:

a = Foo
a = Foo.where(age: 18)
if params[:sort] == "desc"
  a = a.order("name desc") 
end

这里执行了两个查询,我想将它们合并为一个,或者你可以说我想执行 Foo.where(age=18).order("name asc")

请记住,可能存在不需要 order 的情况,即 params[:sort] 不等于 desc。

请不要给出解决方案

if params[:sort] == "desc"
    a = a.where(age=18).order("name desc") 
else
    a = a.where(age=18)
end

因为它使代码变得多余,而且对于更多参数,它可能不起作用。

4

3 回答 3

5

不,你错了。实际上,这里不执行任何查询。

a = Foo
a = Foo.where(age=18)
if params[:sort] == "desc"
  a = a.order("name desc") 
end

实际查询发送到您开始检索数据的位置。也就是说,做类似的事情

a.each do |b|
  # do something with b
end

在此之前,您可以安全地链接标准构建方法(whereorderselect其他方法)。

于 2012-08-03T07:38:40.853 回答
0

实际上你的代码只会执行一个查询。这是因为在 Rails 中,只有在您访问结果后才会调用数据库。因此,当您编写 a.first (或类似的东西)时,它将进行数据库调用。

于 2012-08-03T07:39:27.173 回答
0

如果这就是你的意思......一个简单的解决方案是:

a.where(age: 18).order("name #{params[:sort] || 'asc'}")

因此,如果params[:sort]nil,它将默认为asc.

于 2012-08-03T07:39:58.467 回答