I see 2 inserts of KeyValue rows on TranslationValue#create action (and I should only have one). it inserts identical values. Here are my models, the edit template, the create action and the log: models: class TranslationKey < ActiveRecord::Base has_many :key_values has_many :translation_values, :through => :key_values end class TranslationValue < ActiveRecord::Base has_many :key_values has_many :translation_keys, :through => :key_values accepts_nested_attributes_for :translation_keys end class KeyValue < ActiveRecord::Base belongs_to :translation_value belongs_to :translation_key end edit tepmlate: <% form_for(@content) do |f| %> <% if f.error_messages.length > 0 %> <div class="error-message"> <%= error_messages_for :content, :header_message => ''Error'', :message => '''' %> </div> <% end %> <p> <% f.fields_for :translation_keys do |key_form| %> <%= key_form.label :name, ''Key name'' %> <br /> <%= key_form.text_field :name %> <br /> <br /> <%= key_form.label :tag_list, ''Add Tags'' %> (separate tags with a comma '','' ) <br /> <%= key_form.text_field :tag_list %> <% end %> </p> <p> <%= f.label :text, ''Content'' %><br /> <%= f.text_area :text %> </p> <p> <%= f.submit ''Create'' %> </p> <% end %> create action: def create @content = TranslationValue.new respond_to do |format| if @content.update_attributes( params[:translation_value] ) flash[:notice] = ''Key was successfully created.'' format.html { redirect_to(translation_keys_path) } format.xml { render :xml => @content, :status => :created, :location => @content } else format.html { render :action => "new" } format.xml { render :xml => @content.errors, :status => :unprocessable_entity } end end end Processing TranslationValuesController#create (for 127.0.0.1 at 2010-05-03 19:47:03) [POST] Parameters: {"commit"=>"Create", "translation_value"=>{"text"=>"value13", "translation_keys_attributes"=>{"0"=>{"name"=>"key13", "tag_list"=>""}}}, "authenticity_token"=>"J+dt/ qHwHkbKygh0wBPnXPLtpkb3Pb8URxGucEbpLa0="} Language Load (0.1ms) SELECT * FROM `languages` TranslationValue Columns (0.6ms) SHOW FIELDS FROM `translation_values` TranslationKey Columns (0.5ms) SHOW FIELDS FROM `translation_keys` SQL (0.0ms) BEGIN TranslationKey Load (0.2ms) SELECT `translation_keys`.id FROM `translation_keys` WHERE (`translation_keys`.`name` = BINARY ''key13'') LIMIT 1 CACHE (0.0ms) SELECT `translation_keys`.id FROM `translation_keys` WHERE (`translation_keys`.`name` = BINARY ''key13'') LIMIT 1 TranslationValue Create (0.1ms) INSERT INTO `translation_values` (`created_at`, `updated_at`, `text`, `language_id`) VALUES(''2010-05-03 19:47:03'', ''2010-05-03 19:47:03'', ''value13'', NULL) TranslationKey Create (0.1ms) INSERT INTO `translation_keys` (`name`, `created_at`, `updated_at`) VALUES(''key13'', ''2010-05-03 19:47:03'', ''2010-05-03 19:47:03'') Tag Load (0.2ms) SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.id = `taggings`.tag_id WHERE (((taggings.context = ''tags'' AND taggings.tagger_id IS NULL) AND ((`taggings`.taggable_id = 8) AND (`taggings`.taggable_type = ''TranslationKey''))) AND ((`taggings`.taggable_id = 8) AND (`taggings`.taggable_type ''TranslationKey''))) Tagging Load (0.2ms) SELECT * FROM `taggings` WHERE (((`taggings`.`tagger_id` IS NULL AND `taggings`.`tag_id` IN (NULL) AND `taggings`.`context` = ''tags'' AND `taggings`.`tagger_type` IS NULL) AND (`taggings`.taggable_id = 8 AND `taggings`.taggable_type ''TranslationKey'')) AND (`taggings`.taggable_id = 8 AND `taggings`.taggable_type = ''TranslationKey'')) KeyValue Columns (0.5ms) SHOW FIELDS FROM `key_values` KeyValue Create (0.1ms) INSERT INTO `key_values` (`translation_key_id`, `translation_value_id`, `created_at`, `updated_at`) VALUES(8, 21, ''2010-05-03 19:47:03'', ''2010-05-03 19:47:03'') KeyValue Create (0.1ms) INSERT INTO `key_values` (`translation_key_id`, `translation_value_id`, `created_at`, `updated_at`) VALUES(8, 21, ''2010-05-03 19:47:03'', ''2010-05-03 19:47:03'') SQL (2.3ms) COMMIT Redirected to http://0.0.0.0:3000/translation_keys Completed in 29ms (DB: 5) | 302 Found [http://0.0.0.0/ translation_values] Thanks! -- 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 this group at http://groups.google.com/group/rubyonrails-talk?hl=en.