如何查找查询结果的大小

时间:2015-12-31 03:53:28

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

我在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}

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

  •   
  • 我应该怎样做才能获得records

  • 的大小   

3 个答案:

答案 0 :(得分:5)

我可能走错了路,但我认为这个问题与.size的工作方式有关。

尺寸会自动尝试确定是要拨打.count还是.length。这些行为如下:

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

然而,在偶然事件.size将返回一个哈希值(因为它决定使用.count

所以你的解决方案可能是使用.length,它将返回一个整数。

答案 1 :(得分:3)

你可以使用:

results.length

size方法使用以这种方式运行的sql count方法。

答案 2 :(得分:0)

我刚刚在上面的示例中尝试了一个变体(使用我自己现有的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 

您确定您的记录模型是否继承自ActiveRecord::Base