【问题标题】:How to count all objects in Database via Active Record如何通过 Active Record 统计数据库中的所有对象
【发布时间】:2018-05-30 02:06:56
【问题描述】:

我想做的是计算数据库中的所有对象。我从这样的事情开始:

p ["TOTAL COUNT", ApplicationRecord.subclasses.sum(&:count)]

但在实验中我发现...

[5] pry(main)> ApplicationRecord.subclasses.count => 6

我期望的回报远不止于此。我可以检查子类并发现缺少一些子类。

然后我发现....

[8] pry(main)> ActiveRecord::Base.descendants.count => 10

又增加了一些。再次,我可以单独检查它们,我注意到有一些丢失了。这是一个缺少的示例...

class MerchantsPrincipal < ApplicationRecord  
end

class Principal < MerchantsPrincipal 
end

我如何确保这些也包括在内?

【问题讨论】:

  • 对不起,你为什么需要这个?也许如果您描述完整的业务案例,它有助于通过正常的解决方案来解决它。因为你的问题有点奇怪。
  • 另外,你所说的“所有对象”是什么意思?数据库中所有表中的所有域(AR 类)或所有行(所有 AR 实例)?
  • @MaxVinogradov 我正在查找表中的所有 AR 实例或行。我有一个绝对一团糟的黄瓜套件,我怀疑它非常慢,因为使用的工厂创建的对象比必要的多。我想找到对象创建的最严重违规者,看看我是否可以先修复这些测试。这有意义吗?
  • 而且,我不知道你有什么测试,但也许模拟 db 记录实体是合理的?
  • 请注意,MerchantsPrincipal.count 已经包含 Principal.count,因为 STI 的工作原理,所以 descendants 不是您要查找的内容。

标签: ruby-on-rails database postgresql activerecord


【解决方案1】:

这不是您问题的答案,而是给您的建议,以加快您的测试套件。

您可以使用 FactoryGirl 进行一些缓存,如下所示:

class RecordCache
  def self.[](key)
    all.fetch(key)
  end

  def self.register(name, object)
    all[name] = object
  end

  def self.setup!
    register :admin_user, FactoryGirl.create(:user, is_admin: true)
  end

  private

  def all
    @all ||= {}
  end
end

那么你需要在运行你的测试套件之前在你的test_helper.rb 中调用RecordCache.setup!

之后,您将可以要求 RecordCache 提供实例,而不是让 FactoryGirl 再次创建它:

FactoryGirl.define do
  factory :post do
    # title content etc.
    user { RecordCache[:admin_user] }
  end
end

这样每次调用FactoryGirl.create(:post) 时,它都不会创建另一个用户。这带来了一些问题,因为相同的记录是通过应用程序缓存的,不应该被修改。但是,如果您希望针对特定上下文的特定用户,您仍然可以这样做:

FactoryGirl.create(:post, user: FactoryGirl.create(:user, :super_admin))

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多