Ruby on rails 如何通过活动记录统计数据库中的所有对象

Ruby on rails 如何通过活动记录统计数据库中的所有对象,ruby-on-rails,database,postgresql,activerecord,Ruby On Rails,Database,Postgresql,Activerecord,我要做的是统计数据库中的所有对象。我是这样开始的: 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 pr

我要做的是统计数据库中的所有对象。我是这样开始的:

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
p[“总计数”,ApplicationRecord.subclass.sum(&:COUNT)]

但在实验中我发现

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

我期望回报的远不止这些。我可以检查这些子类,发现有些子类丢失了

然后我发现

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

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

class MerchantsPrincipal < ApplicationRecord  
end

class Principal < MerchantsPrincipal 
end
class-MerchantsPrincipal

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

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

您可以使用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
然后您需要调用
RecordCache.setuptest\u helper.rb
中输入code>

之后,您将能够要求此
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))

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