Checkboxes with a has_many :through relation

All,

I’m populating a view with checkboxes in a list. I want to be able to
assign to my has_many relationship using the post values of these
checkboxes. Essentially, I want to populate the relationship table
which will create the correct join values in my model.

Here is my check_box_tag code:

<%= check_box_tag("@current_job[target_list_ids][]",
tlist.DataSetID,
@current_job.target_lists.include?(tlist)) %>

So, in this example, tlist is an element of another array that I’m
starting with to give me the list of choices. But what I want is to
assign these choices into the “target_lists” collection of my
@current_job object (again, via the “through” table based on my has_many
definition.

current_job :has_many target_lists :through an association.

I first followed the examples of using checkboxes with HABTM. However,
since I switched my model to user has_many :through, and so I’m pretty
sure that I no longer get the target_lists_ids method above like I would
if I were using HABTM.

And actually, I’m not sure I care about that, since I know I should just
be able to process through the values that I get from the form anyway.
I’m having trouble getting at the values of the checkbox, even though in
my parameter list, I see that they are available:

@current_job”=>{“target_list_ids”=>[“1”, “3”]}

There’s something very basic that I’m missing here. I want to be able
to grab these values in my controller method and do something like:

params[@current_job][:target_list_ids].each {
//Do what’s necessary to link up my models via the has_many :though
relationship by populating the “through” table.
}

Is my problem that I’m naming my checkboxes using
@current_job[target_list_ids], and this is being literally interpreted
and ending up in the view that way?

I hope this makes sense. I think I am generally confused about how the
check_box and check_box_tag helpers work.

Thanks,
Wes

I have the same problem does anyone else have any suggestions on this?

Wes G. wrote:

All,

I’m populating a view with checkboxes in a list. I want to be able to
assign to my has_many relationship using the post values of these
checkboxes. Essentially, I want to populate the relationship table
which will create the correct join values in my model.

…snip…

I hope this makes sense. I think I am generally confused about how the
check_box and check_box_tag helpers work.

Thanks,
Wes

JoeWooten wrote:

I have the same problem does anyone else have any suggestions on this?

Wes G. wrote:

All,

I’m populating a view with checkboxes in a list. I want to be able to
assign to my has_many relationship using the post values of these
checkboxes. Essentially, I want to populate the relationship table
which will create the correct join values in my model.

…snip…

I hope this makes sense. I think I am generally confused about how the
check_box and check_box_tag helpers work.

Thanks,
Wes

Joe,

I got this working but don’t have time to post the code right now. Send
an email to weyus at att dot net and please remind me to post my
solution.

Thanks,
Wes

On this day, 16-July-2006 4:48 AM, JoeWooten wrote:

…snip…

I hope this makes sense. I think I am generally confused about how the
check_box and check_box_tag helpers work.

Thanks,
Wes

Found these links.
jrhicks.net → checkout the pdf
Peak Obsession
Peak Obsession —> the
main page

P.V.Anthony

Joe,

Here’s what I ended up doing…

Job and TargetList are related through their association object.
Basically, in the form, I’m manipulating indices of an array that I then
use to populate the “through” object. So I’m not attempting to
manipulate the “child” or “parent” model directly.

Hope this helps,
Wes

Job model:

has_many :job_list_associations, :foreign_key => :JobReferenceNumber
has_many :target_lists, :through => :job_list_associations, :source =>
:target_list

TargetList model:

has_many :job_list_associations, :foreign_key => :DataSetID
has_many :jobs, :through => :job_list_associations, :source => :job

Job model:

public
def target_list_ids
ids = Array.new
unless target_lists.nil?
target_lists.each do |list|
ids << list.DataSetID
end
end
ids
end

public
def target_list_ids=(list_array)
list_array.each do |id|
target_lists << TargetList.find(id)
end
end

View:

<%= check_box_tag("current_job[target_list_ids][]", tlist.DataSetID, @current_job.target_lists.include?(tlist), :class => 'list-data') %> <%= tlist.Alias %>

Controller calls this method in the job model to manage the
associations:

public
def set_list_relationships(selected_lists)
#Find all of the existing associations before we save anything
current_job_lists = Array.new
JobListAssociation.find_all_by_JobReferenceNumber(self.JobReferenceNumber,
:select => ‘DataSetID’).each { |jla|
current_job_lists << jla.DataSetID
}

#For each submitted list identifier...
selected_lists.each { |value|
  #...add the association if it doesn't exist and record that it was 

submitted
unless current_job_lists.include?(value)
jla = JobListAssociation.new
jla.JobReferenceNumber = self.JobReferenceNumber
jla.DataSetID = value
jla.FaxDataTable = TargetList.find(value).Alias
jla.save!
end
}

#Finally, remove all of the lists that were already stored but were 

not selected this time around.
(current_job_lists - selected_lists).each { |value|
JobListAssociation.destroy_all(“JobReferenceNumber =
#{self.JobReferenceNumber} AND DataSetId = #{value}”)
}
end