Has_and_belongs_to_many relationship in nested forms


#1

Hi,

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?

Thanks,

Josh


#2

On Wed, Mar 25, 2009 at 2:38 AM, Josh M. removed_email_address@domain.invalid
wrote:

Hi,

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.


Greg D.
http://destiney.com/


#3

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.

Thanks,

Josh

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

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

def new
@stress_test = StressTest.new

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

end

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’
else
render :action => ‘new’
end
end

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

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() {
$(“a[class=“add_codesecure_project”]”).click(function(event){
var copy_object = $(“ul”).children().eq(0).clone()
copy_object.appendTo(“ul”);
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)));

//alert(copy_object.children("select").attr("id"))
//alert(copy_object.attr("id"));

add_remove_link();

});

});


#4

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!


#5

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.

Josh