【问题标题】:How to find size of query result如何查找查询结果的大小
【发布时间】:2016-04-05 02:11:34
【问题描述】:

我在 Rails 中有以下查询:

records = Record.select('y_id, source')
                .where(:source => source, :y_id => y_id)
                .group(:y_id, :source)
                .having('count(*) = 1')

如果我 puts records:
[#<Record source: "XYZ", y_id: 10000009>, #<Record source: "XYZ", y_id: 10000070>]

,我会得到以下输出

看起来输出数组中有 2 个元素。但是当我尝试做records.size 我得到:
{[10000009, "XYZ"]=>1, [10000070, "XYZ"]=>1}

  • 当 records 是一个有 2 个元素的数组时,为什么 records.size 不打印 2group by 查询结果是否因某种原因表现不同?

  • 我应该怎么做才能得到records的大小

【问题讨论】:

    标签: ruby-on-rails arrays activerecord sqlite group-by


    【解决方案1】:

    我可能走错了路,但我认为问题在于 .size 的工作方式。

    Size会自动尝试判断是调用.count还是.length。它们的行为方式如下:

    • .count 执行 SQL COUNT
    • .length 计算结果数组的长度

    但是在某些情况下.size 会返回一个哈希值(因为它决定使用.count

    因此您的解决方案可能是使用.length,它将返回一个整数。

    【讨论】:

    • 像魅力一样工作。非常感谢!
    【解决方案2】:

    您可以使用:

    results.length
    

    size 方法使用 sql count 方法,它的行为方式就是这样。

    【讨论】:

      【解决方案3】:

      我刚刚在上面的示例中尝试了一个变体(使用我自己现有的 Rails 应用程序和数据库),它可以正常工作:

      records = Site.select('name','url')
          .where(:name => 'Washington Post', :url => 'https://www.washingtonpost.com/')
          .group(:name, :url)
          .having('count(*) = 1')
      
       => #<ActiveRecord::Relation [#<Site id: nil, name: "Washington Post", url: "https://www.washingtonpost.com/">]> 
      
      records.size
      
       => 1 
      

      您确定您的 Record 模型继承自 ActiveRecord::Base

      【讨论】:

      • 是的,我确信我的模型继承自 ActiveRecord::Base
      • 你可能是对的:在我发表这篇文章时(昨天),我没有足够的声誉来发表评论,但我想提供一个他问题的工作变体的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多