From 827e8304ee1fe739add4d20267d985994848dd3f Mon Sep 17 00:00:00 2001 From: "Marcos G. Zimmermann" Date: Mon, 29 Jul 2024 15:30:12 -0300 Subject: [PATCH] feat: add count and size to collection --- lib/esse/active_record/collection.rb | 5 +++++ spec/esse/active_record/collection_spec.rb | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/esse/active_record/collection.rb b/lib/esse/active_record/collection.rb index 98aa346..06b0a65 100644 --- a/lib/esse/active_record/collection.rb +++ b/lib/esse/active_record/collection.rb @@ -89,6 +89,11 @@ def each_batch_ids end end + def count + dataset.except(:includes, :preload, :eager_load).count + end + alias_method :size, :count + def dataset(**kwargs) query = self.class.base_scope&.call || raise(NotImplementedError, "No scope defined for #{self.class}") query = query.except(:order, :limit, :offset) diff --git a/spec/esse/active_record/collection_spec.rb b/spec/esse/active_record/collection_spec.rb index 8df2e48..a5530b4 100644 --- a/spec/esse/active_record/collection_spec.rb +++ b/spec/esse/active_record/collection_spec.rb @@ -146,6 +146,22 @@ end end + describe '#count' do + it 'raises NotImplementedError when scope is not defined on the collection class' do + expect { + collection = described_class.new + collection.count + }.to raise_error(NotImplementedError) + end + + it 'returns the count of the dataset' do + collection = Class.new(described_class) + collection.base_scope = -> { Animal.all } + expect(collection.new.count).to eq(Animal.count) + expect(collection.new.size).to eq(Animal.count) + end + end + describe '#dataset' do it 'returns an ActiveRecord::Relation' do collection = Class.new(described_class)