Rails 5 Console Query для подсчета ВСЕХ записей в БД? - PullRequest
0 голосов
/ 16 января 2020

Есть ли команда / запрос, который я могу запустить в консоли rails для подсчета всех записей всех моделей в БД?

(с использованием Rails 5 и Postgres)

Ответы [ 3 ]

1 голос
/ 16 января 2020

Все активные модели записей являются потомками ApplicationRecord, поэтому вы можете сделать ...

ApplicationRecord.descendants.map(&:count).inject(:+)

Обратите внимание, что вне производства классы, как правило, загружаются только при необходимости, поэтому, если вы заинтересованы в получении количество для непроизводственной среды (например, разработки), вам необходимо изменить конфигурацию, чтобы обеспечить загрузку всех записей. В config/environment/development.rb set

config.eager_load = true

Вы можете оставить все как есть, но это замедлит время запуска вашего сервера разработки. Лично я не нахожу это проблемой, но это зависит от размера вашего приложения.

Обратите внимание, что ... как указано max в комментариях, если вы сделаете reload! в своей консоли, ваш ApplicationRecord.descendants будет пустым массивом.

0 голосов
/ 16 января 2020

Это не однострочник, но он обрабатывает нетрадиционные модели, в которых имя таблицы не соответствует имени класса. Он использует ApplicationRecord.descents, но обрабатывает предупреждение о том, что его ленивая загрузка:

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  # ApplicationRecord.descendants is lazy loading so we must
  # force rails to load all the models
  def self.eager_load_descendants!
    Dir.glob(Rails.root.join('app', 'models', '**', '*.rb')).map do |pn|
      require_dependency pn
    end
  end

  def self.count_all_models
    eager_load_descendants!
    descendants.each_with_object({}) do |model, hash|
      hash[model.model_name.plural] = model.count
    end
  end
end

Возвращает га sh:

{"users"=>5, "rainbows"=>2, "ponies"=>0}

Если вам нужна общая сумма, вы можете просто сделать :

irb(main):002:0> {"users"=>5, "rainbows"=>2, "ponies"=>0}.values.sum
=> 7
0 голосов
/ 16 января 2020

Вы можете сделать это

ActiveRecord::Base.connection.tables.each do |table|
  next if table.classify.safe_constantize.nil?
  count = table.classify.safe_constantize.count
  puts "#{table} -> #{count}"
end
...