【问题标题】:Rails: combine two queries into oneRails:将两个查询合二为一
【发布时间】:2012-08-03 07:35:02
【问题描述】:

我是 Rails 新手。以下是以 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

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

【问题讨论】:

  • 旁注:恕我直言重用名称变量不是一个好的编程习惯。使用有意义的名称创建新变量,这样可以更轻松地跟踪函数(并对其进行调试)。
  • @tokland 将来会尝试跟进。
  • 另外,where(age=18) 是怎么回事?不应该是where(age: 18)还是where("age=18")?
  • 对不起,rails 新手 :),我在这里打错了

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


【解决方案1】:

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

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

【讨论】:

  • 也许你是对的,但是当我查看控制台时,它显示了两个查询。
  • 也许你做点别的。你能仔细检查一下吗?
  • 嘿,我认为你是对的,只有我自己弄错了,而不是控制器,我应该在视图中寻找问题。谢谢:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    所以如果params[:sort] 是nil,它将默认为asc。

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2014-06-23
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多