Forum: Ruby on Rails Q. re: Using models as join tables AND multiple models in fo

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Rick S. (Guest)
on 2007-02-14 22:25
(Received via mailing list)
I read the section from AWDWR 2ed beginning at p. 337 about using a
model to join tables.  I'm trying to combine this concept with having
multiple models on one form.

Let's say I have classes Account and Employee, with a many-to-many
relationship between them.  I don't want to use a pure join table
because I want the AccountEmployee table to also contain a column for
"role".  (Actually, I will name the join table AccountEmployeeRelations)

I believe the model would look like this:

class Account < AR::Base
   has_many :account_employee_relations
   has_many :employees :through => :account_employee_relations

class Employee < AR::Base
   has_many :account_employee_relations
   has_many :accounts :through => :account_employee_relations

I assume I also need (but the book does not show):

class AccountEmployeeRelation < AR::Base
  belongs_to :accounts
  belongs_to :employees

In the migration for AccountEmployeeRelation I would guess I need lines
   t.column :account_id, :integer
   t.column :employee_id, :integer
   t.column :role, :string

The rest of my question probably depends on my interface.  I guess I
could first create an account, and then on a separate form assign
employees to that account.  I haven't tried that, but I would expect
that approach to be fairly easy.

But if I want to create the account and assign the employees in one
form, I turn to p. 490 "Multiple Models in a Form".  Let's look at the
controller and view for edit/update (I might be able to figure out the
rest once I have this part).

def edit
  @account = account.find(params[:id])
  @account_employee_relations = @account.employee_account_relations   #
I think this is an array ?

# I haven't worked on update yet since I can't get edit to work...but
I'm sure this won't work.
def update
  @account = account.find(params[:id])
  if @account.update_attributes(params[:account])
    flash[:notice] = 'account was successfully updated.'
    redirect_to :action => 'show', :id => @account
    render :action => 'edit'

I'm quite lost on this section of edit.rhtml:

<% form_for :account, @account, :url => { :action => "update", :id =>
@account } do |form| %>

<!-- I think I want to loop over all the assigned employees like this:
<% @account_employee_relations.each do |r| %>
<!-- Now I need a fields_for...over r ? -->
<% fields_for r do |f| %>
   <th><label for="x">Employee:</label></th>
<!-- I want a selection box listing all the employees, with the
currently assigned employee as the default selection -->
   <td><%=, [array of names] %>  THIS DOES NOT
   <label for="x">Role:</label>
   <%=, @account_employee_relation.possible_roles)
%></td>   <!-- possible_roles is defined in the model -->
<% end %>
<% end %>

Any help is appreciated!
This topic is locked and can not be replied to.