-
Notifications
You must be signed in to change notification settings - Fork 277
model.collection_model_ids (many to many)
Richard Huang edited this page Dec 4, 2010
·
7 revisions
Please go to http://rails-bestpractices.com/posts/8-model-collection_model_ids-many-to-many
Before:
class User < ActiveRecord::Base
has_many :user_role_relationships
has_many :roles, :through => :user_role_relationships
end
class UserRoleRelationship < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class Role < ActiveRecord::Base
end
<% form_for @user do |f| %>
<%= f.text_field :email %>
<% Role.all.each |role| %>
<%= check_box_tag 'role_id[]', role.id, @user.roles.include?(role) %>
<%= role.name %>
<% end %>
<% end %>
class UsersController < ApplicationController
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
@user.roles.delete_all
(params[:role_id] || []).each { |i| @user.roles << Role.find(i) }
end
end
end
After:
<% form_for @user do |f| %>
<% Role.all.each |role| %>
<%= check_box_tag 'user[role_ids][]', role.id, @user.roles.include?(role) %>
<%= role.name %>
<% end %>
<%= hidden_field_tag 'user[role_ids][]', '' %>
<% end %>
class UsersController < ApplicationController
def update
@user = User.find(params[:id])
@user.update_attributes(params[:user])
# the same as @user.role_ids = params[:user][:role_ids]
end
end