problems with has_many :through and habtm

I have tried this both ways and each time same results, duplicate entries.

Here is the simple test: t = Trim.find(:first, :conditions => ['id > 65000000']) options = Option.find_all_by_trim_id( puts options.size v ={:trim_id =>}) v.option_ids = {|o|}

I also tried it just with v.options = options, using option_ids was just another attempt to make this work

The size of options in this case is 47. options_vehicles which is my join table will have 94 results exactly 2 of each one option. So if the option_id = 6 and vehicle_id is 4 i have 6,4 in the join table twice.

I am doing one thing a little odd, but i have no idea what's causing this issue. My models look like this: Option.rb set_primary_key "option_id"   has_many :options_vehicles   has_many :vehicles, :through => :options_vehicles

I have to use option_id as the primary key and it's a string. This is other data i'm importing and I can't change the way it's organzied.

Vehicle.rb   has_many :options_vehicles,   has_many :options, :through => :options_vehicles

My join table looks like a habtm table because it was. I have tried this both ways activerecord continues to put in dupes.

I actually went into the code at /data/www/production/vendor/rails/activerecord/lib/active_record/ associations.rb:1392 and put prints in there and see it showing the size of the records to save as 47, but it's going through here twice.

I have option_id in options marked as the primary key with a unique index in mysql.

Any help would be appreciated I feel like I'm going crazy... Erik

You don't need to do the Options.find because you already have t.options. This may also explain the dupes.


I don't follow you.

I find all the options based on the idea of a trim (a style). Think about how a honda civic ex might have different options then a honda civic lx. In the real app you would only select a subset of those options to assign to your vehicle. Vehicle is kind of like an instance of a Trim, but it's different and has it's own model. So I am grabbing all the options by trim (options = Option.find_all_by_trim_id( and then assigning them to a vehicle (v.options = options or v.options_ids = options_ids).

You are right I could of done t.options instead of Option.find_all_by_trim_id, but I have tried both. I replaced: Option.find_all_by_trim_id with options = t.options and I have 47 in the array of options, but 94 are saved, 2 each exactly.

It works fine if I do: options.each {|o|   OptionsVehicle.create({'option_id' => o.option_id, 'vehicle_id' =>}) }

and explicitly create the join table values.

I have confused rails...I guess. Erik

I'm in Rails 2.2.2 if that matters. Erik

What are the associations for the Trim model, wrt Options and Vehicles? I'm also assuming that the NewVehicle model is a typo and it's supposed to be just in the snippet.

I'm thinking that you need either uniqueness validations or to dedupe manually in your save/updates, but it's hard to tell so far.


NewVehicle is STI off of Vehicle. It doesn't matter if you use Vehicle or NewVehicle the outcome is the same.

Trim definition: class Trim < ActiveRecord::Base ## Associations   belongs_to :model   has_many :colors   has_many :options

so it has_many options, which is why t.options would of worked along with find the options by trim id. class Vehicle < ActiveRecord::Base def Vehicle:

  ## Associations   belongs_to :trim   belongs_to :base_exterior_color, :class_name =>'Colors', :foreign_key => 'exterior_color_base_id'   has_many :options_vehicles, :foreign_key => :vehicle_id   has_many :options, :through => :options_vehicles

I think you are on the right track. Since a vehicle belongs to a trim, that trim already has every single option available for that car attached to it. What I want to do is say only X amount of those options are actually on this Vehicle though. Vehicle is more of an instance of a trim. I do need to store the trims though...i can't just make them a pure virtual class.

Unique doesn't work exactly. It's fine on the read, but i still have double values in the join table.

It must be something to do with the fact trim has_many options and vehicles belong to a trim? i would assume this would work as i'm saving into a join table.