Ruby on Rails Wednesday, August 31, 2011

I think I understand that only belongs_to association can be
polymorphic. The model that carries belongs_to gets the foreign key
and :polymorphic => true.

But I want to model the following:

A User "has_one" vehicle, which can be either a "Car" or a "Truck",
but not both (this is a requirement). My natural inclination is toward
declaring it thus:

class User < ActiveRecord::Base
has_one :vehicle
end

class Vehicle < ActiveRecord::Base
belongs_to :user
end

class Car < Vehicle
attr_accessible :capacity # no. of passengers it can carry
end

class Truck < Vehicle
attr_accessible :horse_power # 150, 200, 250 ...
end

My goal is to be able to have foreign key in the :cars and :trucks
tables in the form of user_id and have no :vehicles table. I of course
want the association methods to work the way they do in class has_one
-- belongs_to combo, i.e. I should be able to do @user.vehicle to mean
either nil or car or truck that user owns, @car.user to be the user
owning that car etc.

I think these expectations are wrong. For instance, since I declared
Vehicle to be an AR model, I need to have :vehicles table. Period. But
when I am modeling the abstractions, I don't need any persistence for
(abstract) Vehicle. I just need to persist either a car or a truck for
a user. Thus, :users table just contains the info relevant to the user
whereas the :cars and :trucks table contains car- and truck-relevant
info along with a user_id foreign key.

Another problem I see with my expectations is that both Car and Truck
must declare belongs_to :user. Period. I am willing to do that, but my
expectation is that since Car is a Vehicle, the belongs_to association
should be inherited by the Car.

Can someone please help me see things more clearly and work around the
issues so that I can capture my relationship succinctly?

Best Regards,
Kedar

--
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 rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

No comments:

Post a Comment