diff --git a/lib/orm_adapter/adapters/active_record.rb b/lib/orm_adapter/adapters/active_record.rb index 9626f04..273d04c 100644 --- a/lib/orm_adapter/adapters/active_record.rb +++ b/lib/orm_adapter/adapters/active_record.rb @@ -23,6 +23,13 @@ def find_first(options = {}) klass.where(conditions_to_fields(conditions)).order(*order_clause(order)).first end + # @see OrmAdapter::Base#find_collection + def find_collection(options = {}) + conditions, order, limit, offset = extract_conditions!(options) + klass.where(conditions_to_fields(conditions)).order(*order_clause(order)) + end + + # @see OrmAdapter::Base#find_all def find_all(options = {}) conditions, order, limit, offset = extract_conditions!(options) diff --git a/lib/orm_adapter/adapters/mongoid.rb b/lib/orm_adapter/adapters/mongoid.rb index aaca494..158f94b 100644 --- a/lib/orm_adapter/adapters/mongoid.rb +++ b/lib/orm_adapter/adapters/mongoid.rb @@ -28,6 +28,12 @@ def find_first(options = {}) klass.limit(1).where(conditions_to_fields(conditions)).order_by(order).first end + # @see OrmAdapter::Base#find_collection + def find_collection(options = {}) + conditions, order = extract_conditions!(options) + klass.where(conditions_to_fields(conditions)).order_by(order) + end + # @see OrmAdapter::Base#find_all def find_all(options = {}) conditions, order, limit, offset = extract_conditions!(options) diff --git a/lib/orm_adapter/base.rb b/lib/orm_adapter/base.rb index 1bb6133..ef8999f 100644 --- a/lib/orm_adapter/base.rb +++ b/lib/orm_adapter/base.rb @@ -68,6 +68,10 @@ def find_all(options = {}) raise NotSupportedError end + def find_collection(options = {}) + raise NotSupportedError + end + # Create a model using attributes def create!(attributes = {}) raise NotSupportedError diff --git a/spec/orm_adapter/adapters/active_record_spec.rb b/spec/orm_adapter/adapters/active_record_spec.rb index 126beb0..07773c1 100644 --- a/spec/orm_adapter/adapters/active_record_spec.rb +++ b/spec/orm_adapter/adapters/active_record_spec.rb @@ -36,6 +36,59 @@ class Note < AbstractNoteClass it_should_behave_like "example app with orm_adapter" do let(:user_class) { User } let(:note_class) { Note } + + describe "#find_collection" do + let(:note_adapter) { note_class.to_adapter } + let(:user_adapter) { user_class.to_adapter } + describe "(conditions)" do + it "should return only models matching conditions" do + user1 = create_model(user_class, :name => "Fred") + user2 = create_model(user_class, :name => "Fred") + user3 = create_model(user_class, :name => "Betty") + user_adapter.find_collection(:name => "Fred").should == [user1, user2] + end + + it "should return all models if no conditions passed" do + user1 = create_model(user_class, :name => "Fred") + user2 = create_model(user_class, :name => "Fred") + user3 = create_model(user_class, :name => "Betty") + user_adapter.find_collection.should == [user1, user2, user3] + end + + it "should return empty array if no conditions match" do + user_adapter.find_collection(:name => "Fred").should == [] + end + + it "when conditions contain associated object, should return first model if it exists" do + user1, user2 = create_model(user_class), create_model(user_class) + note1 = create_model(note_class, :owner => user1) + note2 = create_model(note_class, :owner => user2) + note_adapter.find_collection(:owner => user2).should == [note2] + end + end + + describe "(:order => )" do + it "should return all models in specified order" do + user1 = create_model(user_class, :name => "Fred", :rating => 1) + user2 = create_model(user_class, :name => "Fred", :rating => 2) + user3 = create_model(user_class, :name => "Betty", :rating => 1) + user_adapter.find_collection(:order => [:name, [:rating, :desc]]).should == [user3, user2, user1] + end + end + + describe "(:conditions => , :order => )" do + it "should return only models matching conditions, in specified order" do + user1 = create_model(user_class, :name => "Fred", :rating => 1) + user2 = create_model(user_class, :name => "Fred", :rating => 2) + user3 = create_model(user_class, :name => "Betty", :rating => 1) + user_adapter.find_collection(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == [user2, user1] + end + end + + it "should return ActiveRecord::Relation class" do + user_class.to_adapter.find_collection.class.should == ActiveRecord::Relation + end + end end describe "#conditions_to_fields" do diff --git a/spec/orm_adapter/adapters/mongoid_spec.rb b/spec/orm_adapter/adapters/mongoid_spec.rb index d2ad526..8887011 100644 --- a/spec/orm_adapter/adapters/mongoid_spec.rb +++ b/spec/orm_adapter/adapters/mongoid_spec.rb @@ -33,6 +33,59 @@ class Note it_should_behave_like "example app with orm_adapter" do let(:user_class) { User } let(:note_class) { Note } + + describe "#find_collection" do + let(:note_adapter) { note_class.to_adapter } + let(:user_adapter) { user_class.to_adapter } + describe "(conditions)" do + it "should return only models matching conditions" do + user1 = create_model(user_class, :name => "Fred") + user2 = create_model(user_class, :name => "Fred") + user3 = create_model(user_class, :name => "Betty") + user_adapter.find_collection(:name => "Fred").should == [user1, user2] + end + + it "should return all models if no conditions passed" do + user1 = create_model(user_class, :name => "Fred") + user2 = create_model(user_class, :name => "Fred") + user3 = create_model(user_class, :name => "Betty") + user_adapter.find_collection.should == [user1, user2, user3] + end + + it "should return empty array if no conditions match" do + user_adapter.find_collection(:name => "Fred").should == [] + end + + it "when conditions contain associated object, should return first model if it exists" do + user1, user2 = create_model(user_class), create_model(user_class) + note1 = create_model(note_class, :owner => user1) + note2 = create_model(note_class, :owner => user2) + note_adapter.find_collection(:owner => user2).should == [note2] + end + end + + describe "(:order => )" do + it "should return all models in specified order" do + user1 = create_model(user_class, :name => "Fred", :rating => 1) + user2 = create_model(user_class, :name => "Fred", :rating => 2) + user3 = create_model(user_class, :name => "Betty", :rating => 1) + user_adapter.find_collection(:order => [:name, [:rating, :desc]]).should == [user3, user2, user1] + end + end + + describe "(:conditions => , :order => )" do + it "should return only models matching conditions, in specified order" do + user1 = create_model(user_class, :name => "Fred", :rating => 1) + user2 = create_model(user_class, :name => "Fred", :rating => 2) + user3 = create_model(user_class, :name => "Betty", :rating => 1) + user_adapter.find_collection(:conditions => {:name => "Fred"}, :order => [:rating, :desc]).should == [user2, user1] + end + end + + it "should return Mongoid::Criteria class" do + user_class.to_adapter.find_collection.class.should == Mongoid::Criteria + end + end end end end diff --git a/spec/orm_adapter/base_spec.rb b/spec/orm_adapter/base_spec.rb index fe0a5a4..b851336 100644 --- a/spec/orm_adapter/base_spec.rb +++ b/spec/orm_adapter/base_spec.rb @@ -78,4 +78,10 @@ end end end -end + + describe '#find_collection' do + it "raises OrmAdapter::NotSupportedError" do + lambda { subject.send(:find_collection) }.should raise_error(OrmAdapter::NotSupportedError) + end + end +end \ No newline at end of file