Rails的活动记录数组计数为0,但记录存在于数据库?

时间:2019-05-30 13:03:28

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

有人可以帮助我解决这个谜吗?

您将对图片进行结帐

Ruby版本-2.6.0 Rails-5.2.2

enter image description here

2 个答案:

答案 0 :(得分:0)

volume_prices不是数组,而是AcitveRecord::Relation,因此可能与它有关。我建议使用#size而不是#length#count。无论是数组还是#sizeRelation都会始终为您提供所需的号码。

如果是关系,它将运行SQL命令进行计数,而不是查询Ruby中的所有记录和THEN计数。

[1] pry(main)> User.all.size
   (0.5ms)  SELECT COUNT(*) FROM `users`
=> 10
[2] pry(main)> User.all.to_a.size
  User Load (0.6ms)  SELECT `users`.* FROM `users`
=> 10
[3] pry(main)> User.all.length
  User Load (0.4ms)  SELECT `users`.* FROM `users`
=> 10

答案 1 :(得分:0)

ActiveRecord::Relation可以加载到内存中。加载关系后,您可以在不使用查询访问数据库的情况下进行处理。

您的情况是,volume_prices是已加载到内存中的关系,因此.length方法将不会对数据库执行任何查询。但是,.count将执行查询,因为ActiveRecord中的it is a calculation method

我认为Activerecord size方法中的source code是这种方法的完美示例,因为它会在确定{{1 }}和count

您可以通过在示例中运行以下行来检查所有这些情况:

length