Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/orm_adapter/adapters/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions lib/orm_adapter/adapters/mongoid.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions lib/orm_adapter/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
53 changes: 53 additions & 0 deletions spec/orm_adapter/adapters/active_record_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 => <order array>)" 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 => <conditions hash>, :order => <order array>)" 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
Expand Down
53 changes: 53 additions & 0 deletions spec/orm_adapter/adapters/mongoid_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 => <order array>)" 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 => <conditions hash>, :order => <order array>)" 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
Expand Down
8 changes: 7 additions & 1 deletion spec/orm_adapter/base_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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