Hi, I am new to RoR and have been pulling my hair out trying to figure out associations. Lets say I have 2 tables: vehicles and vehicle_types. ONE vehicle HAS ONE vehicle_type. Therefore, in my opinion, vehicle_type belongs_to vehicle. Hence, vehicle_types will contain the vehicle foreign key. To me this is already weird. I would like vehicle_types to be a table containing a column that lists types of vehicles- "truck", "car", "bus", etc. It does not need to know what vehicle is associated with it. The vehicles table needs to know what vehicle_type it is. I would like to use the vehicle_types table to populate a Select Menu on a form. If I create the associations as suggested by RoR, with the foreign key going on the belongs_to table (vehicle_types), the Select Menu would be populated with duplicate vehicle_types. EG: vehicle_id vehicle_type_id type 1 1 car 2 2 truck 3 3 car Does this make sense? Like I said I have spent days reading over the associations again and again but I just can''t figure it out. Any help would be greatly appreciated. Thanks. -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
On 1 August 2012 06:04, John Blaze <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Hi, > > I am new to RoR and have been pulling my hair out trying to figure out > associations. > > Lets say I have 2 tables: vehicles and vehicle_types. ONE vehicle HAS > ONE vehicle_type. Therefore, in my opinion, vehicle_type belongs_to > vehicle.No, the names of associations are confusing at times. In your case a vehicle type can be associated with many vehicles, therefore vehicle_type has_many vehicles. A vehicle is only of one type, so vehicle belongs_to vehicle_type, and it is the vehicle that has the vehicle_type_id. Colin> > Hence, vehicle_types will contain the vehicle foreign key. To me this is > already weird. I would like vehicle_types to be a table containing a > column that lists types of vehicles- "truck", "car", "bus", etc. It does > not need to know what vehicle is associated with it. The vehicles table > needs to know what vehicle_type it is. > > I would like to use the vehicle_types table to populate a Select Menu on > a form. If I create the associations as suggested by RoR, with the > foreign key going on the belongs_to table (vehicle_types), the Select > Menu would be populated with duplicate vehicle_types. EG: > > vehicle_id vehicle_type_id type > 1 1 car > 2 2 truck > 3 3 car > > Does this make sense? > > Like I said I have spent days reading over the associations again and > again but I just can''t figure it out. Any help would be greatly > appreciated. > > Thanks. > > -- > Posted via http://www.ruby-forum.com/. > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > For more options, visit https://groups.google.com/groups/opt_out. > >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
Thank you so much for your reply Colin. I believe you are spot on with your answer and what you suggest will work and is the correct solution. For sake of my sanity though, is this solution more of a Rails convention or have I been getting standard database design confused in my head for a number of years? To my previous understanding I still see it as one vehicle has one vehicle_type. Almost like vehicle_type is a child table to the parent vehicle. Is this wrong thinking for all database design or just Rails conventions? -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
On 1 August 2012 08:55, John Blaze <lists-fsXkhYbjdPsEEoCn2XhGlw@public.gmane.org> wrote:> Thank you so much for your reply Colin. > > I believe you are spot on with your answer and what you suggest will > work and is the correct solution. > > For sake of my sanity though, is this solution more of a Rails > convention or have I been getting standard database design confused in > my head for a number of years? To my previous understanding I still see > it as one vehicle has one vehicle_type. Almost like vehicle_type is a > child table to the parent vehicle. Is this wrong thinking for all > database design or just Rails conventions?vehicle_type cannot be like a child to the vehicle, because it is associated with multiple vehicles, how can it be a child of multiple parents? It is the other way round if you want to think of child and parent. A parent (vehicle type) has many children (vehicles), but a child (vehicle) belongs to a single parent. If you are thinking in conventional database design just remember that it is the table that includes the foreign key (vehicle.vehicle_type_id in this case) that must specify the belongs_to association. Colin> > -- > Posted via http://www.ruby-forum.com/. > > -- > 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > For more options, visit https://groups.google.com/groups/opt_out. > >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
Once again, fantastic help Colin. Great explanation and it is all becoming much clearer for me now. Your help was very much appreciated. -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
On Wednesday, 1 August 2012 03:55:31 UTC-4, Ruby-Forum.com User wrote:> > Thank you so much for your reply Colin. > > I believe you are spot on with your answer and what you suggest will > work and is the correct solution. > > For sake of my sanity though, is this solution more of a Rails > convention or have I been getting standard database design confused in > my head for a number of years? To my previous understanding I still see > it as one vehicle has one vehicle_type. >Sometimes the names can have extra baggage that makes it confusing - for example, it seems clearer to say "one vehicle belongs to a single vehicle category". --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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/9rdTCbCWv_8J. For more options, visit https://groups.google.com/groups/opt_out.
Ok, the associations are getting the better of me again. My models for Business, VehicleType and Vehicle. class Business < ActiveRecord::Base has_many :vehicles end class VehicleType < ActiveRecord::Base has_many :vehicles end class Vehicle < ActiveRecord::Base belongs_to :business belongs_to :vehicle_type end Now, my problem is in creating a new vehicle. I can create a Business and VehicleType just fine, but when I try to create a Vehicle I run into problems with the foreign keys. If I try: first_vehicle = Vehicle.new(:veh_name => "test") #then I try adding the new vehicle to my existing business business.vehicles << first_vehicle it generates an error that the foreign key for the vehicle_types table cannot be null. If I try to append the vehicle to the VehicleType first I get an error that the business_id cannot be null. Any ideas here? -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.
It sounds like you''re running up against database foreign key constraints: your model needs to have those id attributes filled in before you can save it. (This is often caught with validations at the rails application layer too, with `validates :vehicle_type, presence: true`) This is one possible approach: business = Business.first car = VehicleType.find_by_name("car") first_vehicle = Vehicle.new first_vehicle.business = business first_vehicle.vehicle_type = car first_vehicle.save Or another way: first_vehicle = Vehicle.create do |v| v.business = business v.vehicle_type = car end Or: first_vehicle = business.vehicles.build(vehicle_type: car) first_vehicle.save Or again: first_vehicle = business.vehicles.create(vehicle_type: car) -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/yv0vU9susn4J. For more options, visit https://groups.google.com/groups/opt_out.
Wow. Amazing response Andrew. I will report back if I have any trouble implementing this. Is there a guide anywhere for best practices with Rails? You have given some great examples but as a newbie I would like to commit to my memory those practices that are highly recommended. -- Posted via http://www.ruby-forum.com/. -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit https://groups.google.com/groups/opt_out.