【问题标题】:ActiveRecord select().where() returns SQL that starts with SELECT COUNT - I don't want COUNTActiveRecord select().where() 返回以 SELECT COUNT 开头的 SQL - 我不想要 COUNT
【发布时间】:2019-10-30 16:20:15
【问题描述】:

我在 rails 中有一个简单的 select().where() 语句,它返回以“SELECT COUNT(...”开头的 SQL,我不知道 COUNT 来自哪里,也不想要它。

我进行了很多谷歌搜索,但由于 COUNT 是一个如此流行的术语,我无法找到任何相关的答案。

这是执行此操作的代码:

@properties = Property.select("property.*").where("(address1 LIKE '%528 Alameda%')")

这是我得到的(从网页上的错误消息中复制):

SELECT COUNT(property.*) FROM `property` WHERE ((address1 LIKE '%528 Alameda%'))

这是我所期望的:

SELECT property.* FROM `property` WHERE ((address1 LIKE '%528 Alameda%'))

为什么要添加 COUNT() 以及如何摆脱它?谢谢!

编辑

原来我找错地方了。它与这段代码没有直接关系:

@properties = Property.select("property.*").where("(address1 LIKE '%528 Alameda%')")

相反,稍后在代码中,我调用了正在生成 SQL 的 @properties.count

SELECT COUNT(property.*) FROM `property` WHERE ((address1 LIKE '%528 Alameda%'))

崩溃了。问题是:那个 SQL 有什么问题?

【问题讨论】:

  • 你能试试看Property.unscoped { Property.select("property.*").where("(address1 LIKE '%528 Alameda%')") }是否返回相同的结果?
  • 可能值得将 Property 模型添加到您的问题中。另外,您使用 arel 得到相同的结果吗? Property.where(Property.arel_table[:address1].matches('%528 Alameda%'))
  • 您是否使用任何类型的分页?大多数分页库都会运行计数以确定总结果和每页计数的页数
  • 您可以添加属性模型以便我们为您提供帮助吗?
  • 这个问题中的代码无法解释这一点。我猜它的分页像@engineersmnky 暗示,或者你在视图中做一些导致计数查询的事情。你必须做更多的工作来追踪它。

标签: ruby-on-rails activerecord


【解决方案1】:

Property.where("address1 LIKE ?", "528 Alameda")

【讨论】:

  • 对于LIKE %528 Alameda%528 Alameda 不同。
【解决方案2】:

COUNT 只能将 1 个列名作为参数。所以可以做COUNT(id),但是不能做COUNT(property.*),或者COUNT(id,builder)等。

解决办法是写@properties.count(:id)

【讨论】:

  • 一个更好的主意是使用.size。如果记录被加载,它将使用长度并避免查询,否则创建COUNT(*)
  • @max 更好!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多