has_and_belongs_to_many relationship in nested forms


I have two models (say model a and b) that are joined using the has_and_belongs_to_many association. In model A I want to be able to link to model B in a form. But, when I create a nested_form for model B I have a problem. Instead of linking to the exciting records in Model B. It creates new ones. Is there anyway to use nested_forms so that model B objects are linked to, but not created on submission? When I create a new model A I just want to link to, not create new model Bs. Is this possible?



Yes, and it's likely someone could help debug the issue if you post the code.

Here is the code. I am sorry because this is work I cannot post the entire application. Thanks for all help and I hope this makes my problem clearer.



class StressTest < ActiveRecord::Base
has_and_belongs_to_many :tst_definitions
accepts_nested_attributes_for :tst_definitions
has_many :tst_datas

class StressTestsController < ApplicationController
layout ‘tests.html’
def index
@stress_tests = StressTest.all

def new
@stress_test = StressTest.new

#want to add not create new tst_definitions
@stress_test.tst_definitions<< TstDefinition.first


def create
@stress_test = StressTest.new(params[:stress_test])
logger.info params.to_yaml
if @stress_test.save
flash[:notice] = “Successfully create Stress Test: #{@stress_test.name}”
redirect_to :action => ‘index’
render :action => ‘new’

def destroy
@stress_test = StressTest.find(params[:id])
redirect_to :action => ‘index’

The new form
New Stress Test

<% form_for(@stress_test) do |f| %>

<%= f.label :name %> <%= f.text_field :name %>
<%= f.label :max_concurrent_scans %> <%= f.text_field :max_concurrent_scans %>
<%= f.label :number_of_runs %> <%= f.text_field :number_of_runs %>

<% f.fields_for :tst_definitions do |test_form| %>

  • <%= test_form.select :name, TstDefinition.find_by_sql(“select id, name from tst_definitions”).collect {|test| [test.name, test.id]} %> <%= link_to ‘Remove’, ‘#remove_project’, :class => ‘remove_codesecure_project’ %>

<%= link_to ‘Add a project’, ‘#add_project’, :class => ‘add_codesecure_project’ %>
<% end -%>
<%= f.submit 'submit' %>

<% end -%>

Javascript that addess a new drop down so that multiple tst_definitions can be added to a single stress_test
$(document).ready(function() {
var copy_object = $(“ul”).children().eq(0).clone()
var num_of_children = $(“ul”).children().size();
copy_object.children(“select”).attr(“id”, copy_object.children(“select”).attr(“id”).replace(/0/, (num_of_children - 1)));
copy_object.children(“select”).attr(“name”, copy_object.children(“select”).attr(“name”).replace(/0/, (num_of_children - 1)));
//alert(copy_object.children(“select”).attr(“id”).replace(/0/, (num_of_children - 1)));





Hi, After I looked into it some more I figured it out. I had a little bit of a concept mix up with accepts_nested_attributes_for. Because I do not want to create nested record. I do not think it is appropriate for this situation. So I do not use it anymore. Thanks for the help sorry to cause people trouble.


So how would you do something like this? I'm not sure whether I would
be better off going with accepts_nested_attributes_for
acts_as_taggable. My example is a habtm relationship between books
and authors. In a "new book" form, I would love to be able to connect
authors already existing in the database, but then being able to add a
new author if they don't already exist. Thanks!