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