I’ve got a polymorphic relation and would like to create an object. How
is it possible to determine whether its a ‘car’ or a ‘truck’?
A person can owe cars and trucks. I could pass params like the car/truck
id to the action but that doesn’t really help me.
For now I do it like this but I don’t like it at all:
person.cars = Car.find(params[:id]) if params[:type] == “Car”
person.truck = Truck.find(params[:id]) if params[:type] == “Truck”
This is really not how I want it. Does anyone knows how to solve that
kind of problem?
I’m not sure of what you need to do but I’ll assume that you just want
to create an association between a person and a vehicle of type car or
truck (or whatever).
I am assuming that you have STI built into your vehicles table, with a
column named ‘type’ that stores the type of vehicle
(‘Car’/‘Truck’/‘Whatever’). If you just want to assign a vehicle to
the person I don’t see a reason why you should know the type of
vehicle it is.
Based on your code you know the id of the vehicle. Why not do
something simpler?:
person.car = Vehicle.find(params[:id])
You might not know the type of vehicle it is but does it matter?
And going even further, do you really need to retrieve the vehicle
row? I guess that if you can’t trust the id beeing an honest value you
should but if you could trust it, couldn’t you just do?:
First of all thank you guys! I think what Valentin wrote is just what I
was looking for. Person, Car, Truck was just an example. It’s a lot more
complexe in my application and you can’t just merge these two different
models into one and add a :type.
I’ll do it like Valentin suggested. Thanks again!
It should be noted that Valentin suggested a STI solution (which is what
I would have recommended) and your question resolved around polymorphic
associations which is a different concept entirely. Polymorphic
associations deal with association polymorphism where as STI deals
primarily wih model polymorphism.
First of all thank you guys! I think what Valentin wrote is just what I
was looking for. Person, Car, Truck was just an example. It’s a lot more
complexe in my application and you can’t just merge these two different
models into one and add a :type.
I’ll do it like Valentin suggested. Thanks again!
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.