
foo.build_bar returns Foo object (belongs_to association)
Reported by Elliott Mason | February 24th, 2008 @ 06:42 PM
What the title says.
class Foo < DataMapper::Base
belongs_to :bar
end
class Bar < DataMapper::Base
has_many :foos
end
foo = Foo.new
foo.build_bar
will return a new Foo object. I went through the code and tracked it down to line 36 of datamapper-0.3.0\lib\data_mapper\associations\belongs_to_association.rb.
def associated_constant
@constant
end
@constant will return the class of the object with the association, so in this case you'd get Foo when you should get Bar. Then at like 119:
def build(options)
@associated = association.associated_constant.new(options)
end
And so it's pretty obvious how things go wrong there. I ran the specs and they passed, which baffled me for another 20 minutes. They passed because
it 'can build its zoo' do
database do |db|
e = Exhibit.new({:name => 'Super Extra Crazy Monkey Cage'})
e.zoo.should == nil
e.build_zoo({:name => 'Monkey Zoo'})
e.zoo.class == Zoo
e.zoo.new_record?.should == true
e.save
end
end
moar like
e.zoo.class.should == Zoo
amirite? Then the tests don't pass because e.zoo would be an Exhibit.
tl;dr, I tried the following and this broke things in an unexpected way
#in datamapper-0.3.0\lib\data_mapper\associations\belongs_to_association.rb
def associated_constant
super
end
Doing this for some reason caused Bar to have a bar_id column... So I basically don't know how to fix this bug at the moment without breaking over things.
Comments and changes to this ticket
-
Elliott Mason February 24th, 2008 @ 09:59 PM
OK here's what I have... Doesn't fail the existing tests (rather the tests when they are fixed).
def create(options) @associated = association.constant.create(options) end def build(options) @associated = association.constant.new(options) end
Don't know how to make a diff patch.
-
Dan Kubb (dkubb) April 15th, 2008 @ 03:17 AM
- Milestone cleared.
-
Sam Smoot April 28th, 2008 @ 01:14 PM
- State changed from new to resolved
Not a problem with 0.9.0.
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »