我是铁杆新手。以下代码以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
因为它使代码冗余,而且对于更多参数,它可能不起作用。
答案 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
在此之前,您可以安全地链接标准构建方法(where
,order
,select
和其他人。)
答案 1 :(得分:0)
实际上您的代码只会执行一个查询。这是因为在rails中,只有在访问结果后才会调用数据库。因此,当您编写a.first(或类似的东西)时,它将进行数据库调用。
答案 2 :(得分:0)
如果它是你的意思......一个简单的解决方案是:
a.where(age: 18).order("name #{params[:sort] || 'asc'}")
因此,如果params[:sort]
为nil
,则默认为asc
。