[Rails] Can only traverse a polymorphic association in one direction

23 views
Skip to first unread message

BarryOg

unread,
May 27, 2010, 7:18:45 AM5/27/10
to rubyonra...@googlegroups.com

Hi all, I'm working on a polymorphic association and I've run into a bit of a
stumbling block. I only seem to be able to traverse the relationship in one
direction and not the other. This is what my code looks like:


class NodeEntry < ActiveRecord::Base
acts_as_nested_set
belongs_to :node, :polymorphic => true
end

class Location < ActiveRecord::Base
attr_accessor :name
has_one :node_entry, :as => :node
validates_presence_of :country, :region, :name
end

class Meter < ActiveRecord::Base
attr_accessor :name, :parent_id
has_one :node_entry, :as => :node
validates_presence_of :meter_identifier, :type_of_meter
end

class MeterGroup < ActiveRecord::Base
has_one :node_entry, :as => :node
end

When I create a new location or meter I use the following code:
@location = Location.new(params[:location])
@location_node = NodeEntry.new(:name => params[:location][:name])
@location_node.node = @location
@location_node.save

After loading a location or meter object from the database, when I attempt
to do a location.node I get an error saying the object doesn't have that
method. When I load a node entry object I have no problem accessing its
node and I get the correct class back.

I can get around this by doing a simple query such as:
NodeEntry.first(:conditions => "node_id = #{loc.id} and node_type =
'Location'").name

but I had assumed active record should be doing this for me under the
covers. Have I made a mistake somewhere or is this the expected behavior of
polymorphic associations?

--
View this message in context: http://old.nabble.com/Can-only-traverse-a-polymorphic-association-in-one-direction-tp28692572p28692572.html
Sent from the RubyOnRails Users mailing list archive at Nabble.com.

Matt Jones

unread,
May 29, 2010, 5:46:12 PM5/29/10
to Ruby on Rails: Talk
The has_one is still named what you've specified (:node_entry in this
case), the polymorphic stuff doesn't change that...

So it'd be:

@location.node_entry

not

@location.node


--Matt Jones

BarryOg

unread,
Jun 3, 2010, 5:51:36 AM6/3/10
to rubyonra...@googlegroups.com

Thanks for taking the time to read through my code and spot the obvious, I
guess too much coffee and too little sleep is not the best recipe.


Matt Jones wrote:
>
>
> The has_one is still named what you've specified (:node_entry in this
> case), the polymorphic stuff doesn't change that...
>
> So it'd be:
>
> @location.node_entry
>
> not
>
> @location.node
>
>
> --Matt Jones
>

> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-ta...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.
>
>
>

--
View this message in context: http://old.nabble.com/Can-only-traverse-a-polymorphic-association-in-one-direction-tp28692572p28765373.html

Reply all
Reply to author
Forward
0 new messages