【问题标题】:No result for select sum query using ActiveRecord (bigint column)使用 ActiveRecord(bigint 列)的 select sum 查询没有结果
【发布时间】:2017-12-29 10:03:10
【问题描述】:

我有一个名为横幅的表格,其列 id (bigint) 和 click (bigint) 和 user_id (bigint)

当我使用以下请求时,在控制台甚至控制器中:

Banner.select("sum(click) as clicks").where(user_id: 5)

我明白了:

 => #<ActiveRecord::Relation [#<Banner id: nil>]>

我在 phppgadmin SQL 中复制了相同的结果请求:

SELECT  sum(click) as clicks FROM "banners" WHERE "banners"."user_id" = 5

它可以工作,但有活动记录它不能!!?

Rails 版本:5.1.4

更新

我试过Banner.select("sum(id)"),它给了我=&gt; #&lt;ActiveRecord::Relation [#&lt;Banner id: nil&gt;]&gt;

使用 users 表:User.select("sum(id)") 它给出:=&gt; #&lt;ActiveRecord::Relation [#&lt;User id: nil, sum: 0.1e1&gt;]&gt;

这很奇怪,因为它适用于一个表而不适用于其他表...我什至切换到另一个项目并尝试了不同的表,但我得到了相同的行为。

【问题讨论】:

  • 尝试使用Banner.select("sum(click) as clicks").where(user_id: 5).first.clicks访问
  • @Manishh 也不起作用 :( 我用更多信息更新了我的问题
  • 确保在这两种情况下使用相同的database,也可以尝试关注Banner.where(user_id: 5).sum(:click)

标签: ruby-on-rails activerecord ruby-on-rails-5


【解决方案1】:

尝试在 id 上添加 group 子句。

Banner.select("sum(click) as clicks").where(user_id: 5).group(:id)

它将返回ActiveRecord::Relation [#&lt;Banner id: nil&gt;, #&lt;Banner id: nil&gt;,现在当您调用.first.clicks 时,它将为您提供所需的输出(点击总和)。如果您还想要 id,则必须在 select 子句中指定 id。

【讨论】:

  • @Marnishh 通过做组,它只是给出了你看到的 Banner 对象的关系,如果你做 .first.clicks 它给出了第一个对象的点击列值
  • 我不明白,我刚刚创建了一个新的品牌 rails 应用程序并创建了一个带有单击列的表格横幅,我添加了两条记录,一条值为 click=3,另一条为 click=5,当我按照您的要求在两个记录(第一条和最后一条)中都显示 1
【解决方案2】:

如果

banners = Banner.select("sum(click) as clicks").where(user_id: 5)

banners.class 将是Banner:ActiveRecord_Relation,为了获取clicks,您必须使用.first.last(因为其中只有一个元素),如下所示

banners.last.clicks

您可以使用验证它

Banner.where(user_id: 5).sum(:click)

【讨论】:

  • 我在控制台中尝试过,它要求我按 id 添加组,当我这样做时,它会给我 Banner:ActiveRecord_Relation 如你所说,但其中的每个对象都有一行的点击(不是总和/总计)
  • 从我检测到,rails 在请求中添加了一个 order by 子句,它强制添加 group by 子句,您知道我们如何防止添加 order by 吗?跨度>
  • 您的横幅模型中可能有类似default_scope { order(id: :desc) } 的内容。您还可以使用.to_sql 来检查您的查询,例如Banner.select("sum(click) as clicks").where(user_id: 5).to_sql
  • 不,我没有默认范围或其他任何东西......看我刚刚创建了一个带有表格横幅的新品牌应用程序,只有一个名为“click”的列,当我这样做时 banners = Banner.select("sum(click) as clicks") 它显示 @987654333 @ 结果是=&gt; #&lt;ActiveRecord::Relation [#&lt;Banner id: nil&gt;]&gt; 对吗?现在,当我尝试访问 banners.first.clicks 时,它会运行另一个请求 SELECT sum(click) as clicks FROM "banners" ORDER BY "banners"."id" ASC LIMIT $1 [["LIMIT", 1]]
  • 同时失败:ERROR: column "banners.id" must appear in the GROUP BY clause or be used in an aggregate function,这个错误是因为第二个请求上面有ORDER BY!它是由 rails 生成的,坦率地说,我没想到会发生第二个请求 + 因为您看到第二个请求只检索一个记录计数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多