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.setup运行测试套件之前,请在test\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是如何工作的,所以子体
不是您想要的。