From 40ff12ed9dacb4ce005b6bc19e6e1200fd11faac Mon Sep 17 00:00:00 2001 From: Jonathan Stott Date: Thu, 10 Jun 2010 12:12:39 +0100 Subject: [PATCH] Initialize relationships before checking for keys DataMapper.finalize now initializes all relationships before checking for keys. This allows a join model which consists entirely of belongs_to relationships with `:key => true' to be considered valid. [#1313 state:resolved] --- lib/dm-core.rb | 8 ++++---- spec/public/finalize_spec.rb | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/dm-core.rb b/lib/dm-core.rb index 59117a33..06db3e5d 100644 --- a/lib/dm-core.rb +++ b/lib/dm-core.rb @@ -327,15 +327,15 @@ def self.finalize_model(model) raise IncompleteModelError, "#{name} must have at least one property or many to one relationship to be valid" end - if model.key(repository_name).empty? - raise IncompleteModelError, "#{name} must have a key to be valid" - end - # initialize join models and target keys relationships.each do |relationship| relationship.child_key relationship.through if relationship.respond_to?(:through) relationship.via if relationship.respond_to?(:via) end + + if model.key(repository_name).empty? + raise IncompleteModelError, "#{name} must have a key to be valid" + end end end diff --git a/spec/public/finalize_spec.rb b/spec/public/finalize_spec.rb index 57262ba9..caa5ee40 100644 --- a/spec/public/finalize_spec.rb +++ b/spec/public/finalize_spec.rb @@ -17,6 +17,25 @@ class ::ValidObject end end + it "should not raise on valid child model" do + class ::ValidChild + include DataMapper::Resource + belongs_to :valid_object, :key => true + end + class ::ValidObject + include DataMapper::Resource + property :id, Integer, :key => true + end + begin + method(:subject).should_not raise_error + ensure + DataMapper::Model.descendants.delete(ValidChild) + DataMapper::Model.descendants.delete(ValidObject) + Object.send(:remove_const, :ValidChild) + Object.send(:remove_const, :ValidObject) + end + end + it 'should raise on an anonymous model' do model = Class.new do include DataMapper::Resource