如何通过Active Record计算数据库中的所有对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过Active Record计算数据库中的所有对象相关的知识,希望对你有一定的参考价值。

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

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

我怎样才能确保这些内容也包括在内?

答案

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

您可以使用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_helper.rb

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

以上是关于如何通过Active Record计算数据库中的所有对象的主要内容,如果未能解决你的问题,请参考以下文章

Active Record 包括 where

Active Record:如何读取具有许多其他对象的db对象?

Yii2中的Active Record可以批量插入数据吗

从 Codeigniter Active Record 中的子查询中选择

Codeigniter Active Record - 计算找到的总行数(MySQL)

业务逻辑层-Active Record