2012-08-03 89 views
0

我是rails新手。这里是富下面的代码模型对象:Rails:将两个查询合并为一个

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 

+1

附注:恕我直言,重新使用名称变量不是一个好的编程习惯。随着时间的推移,用有意义的名称创建新变量,跟踪该函数(并调试它)变得更容易。 – tokland 2012-08-03 07:40:26

+0

@tokland将在未来尝试遵循这一点。 – 2012-08-03 07:42:05

+2

另外,'where(age = 18)'是什么?它不应该是“哪里(年龄:18)”或“哪里(年龄= 18”)? – 2012-08-03 07:44:42

回答

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等)。

+0

可能你是对的,但是当我看着控制台它显示我两个查询。 – 2012-08-03 07:40:28

+0

也许你做别的事。你可以仔细检查一下吗? – 2012-08-03 07:41:36

+0

嘿,我认为你是对的,它只是我错误的人,而不是控制器,我应该在意见中寻找问题。谢谢 :) – 2012-08-03 07:48:59

0

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

0

如果那是你的意思是......一个简单的解决办法是:

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

所以,如果params[:sort]nil,则默认为asc