Rails:将两个查询合并为一个

时间:2012-08-03 07:35:02

标签: ruby-on-rails ruby rails-models

我是铁杆新手。以下代码以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")

请记住,当不需要订单时可能存在这种情况,即params [:sort]不等于desc。

请不要给出像

这样的解决方案
if params[:sort] == "desc"
    a = a.where(age=18).order("name desc") 
else
    a = a.where(age=18)
end

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

3 个答案:

答案 0 :(得分: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和其他人。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

因此,如果params[:sort]nil,则默认为asc