Forum: Ruby on Rails ActiveRecord collection_select and has_and_belongs_to_many

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
69e35322a719156b5bdb5ee4da08061d?d=identicon&s=25 Keith Bottner (Guest)
on 2006-05-11 21:57
(Received via mailing list)
Hello everyone, first post to the list and a relative newbie to Rails
development. Done quite a bit of JSP, PHP, HTML, XML etc and thought I
would
kick the tires on Rails to see if it can speed up development for
internal
applications. Anyway, I am running into a problem that is just driving
me
crazy and everything I read on the net doesn't seem to help. I was
hoping
someone here might have had the same problem and be able to point me in
the
right direction.

Database Schema:

table employees
    id
    name

table projects
    id
    name

table project_roles
    id
    name

table project_members
    id
    employee_id
    project_id
    role_id

I then have the following ActiveRecord objects:

class Employee < ActiveRecord::Base
  has_and_belongs_to_many :project_members, :join_table =>
"project_members", :class_name => "ProjectMember"
end

class Project < ActiveRecord::Base
  has_and_belongs_to_many :project_members, :join_table =>
"project_members", :class_name => "ProjectMember"
end

class ProjectRole < ActiveRecord::Base
  has_and_belongs_to_many :project_members, :join_table =>
"project_members", :class_name => "ProjectMember"
end

class ProjectMember < ActiveRecord::Base
  belongs_to :project
  belongs_to :employee
  belongs_to :project_role
  set_table_name "project_members"
end

The next thing I want to do is to display a multi-select list box, on
the
project form, and display all of the employees that when selected will
add
the proper entries into the project_members table. I would be happy to
write
a method that gets called on submission and transforms the @params into
the
appropriate ActiveRecord requests, but I cannot get the list to display
with
collection_select no matter what I try.

Can someone point me in the right direction? Am I using the
has_and_belongs_to_many relationship wrong? Is it useless to try to get
this
kind of a relationship to show up using collection_select? Is there some
other parameters that I need to use that I am not? Is there a better
pattern
for these type of relationships with regards to integrating them into
the
MVC paradigm?

Any help would be appreciated as I am Googled out!

Keith
882cc23c77c5c6d27613c51396a02a0d?d=identicon&s=25 Stephen Bartholomew (Guest)
on 2006-05-11 23:37
(Received via mailing list)
You might wan to have a look at through associations for this:
http://wiki.rubyonrails.com/rails/pages/ThroughAssociations.

I've also found that using checkboxes is easier for habtm relationships.
Take the following relationship:

class Project < ActiveRecord::Base
   has_and_belongs_to_many :members
end

class Member < ActiveRecord::Base
   has_and_belongs_to_many :projects
end

Your 'edit member' view might show a list of checkboxes for each
project:

<% for project in @projects %>
   <%=check_box_tag name="member[project_ids]",
                    project.id,
                    @member.projects.include?(project) %>
<% end %>

When this is submitted rails will automatically update the joiner table
with the checked associations.

Also, I might be wrong in your case, but you shouldn't have to specify
all the table data in your models - Rails will pick all that up for you.
  For example:

Take the following tables:
parents
children

You models will look like this:

class Parent < ActiveRecord::Base
   has_many :children
end

class Child < ActiveRecord::Base
   belongs_to :parent
end

Rails will do all the hard work for you.

Wow - i really got going on that reply :0)

Hope it helps,

Steve
This topic is locked and can not be replied to.