HABTM Blank Join table

Based of the declaritive_authorization railscast I’ve set up a roles
table containing 3 role types. A user table and a roles_users table.
No matter what I do the join table is always empty.

create_table “roles”, :force => true do |t|
t.string “role_type”
t.datetime “created_at”
t.datetime “updated_at”

create_table “roles_users”, :id => false, :force => true do |t|
t.integer “role_id”
t.integer “user_id”

add_index “roles_users”, [“role_id”], :name =>
add_index “roles_users”, [“user_id”], :name =>

create_table “users”, :force => true do |t|
t.string “first_name”, :null => false
t.string “middle_name”
t.string “last_name”, :null => false
t.string “email”, :null => false
t.string “dealer_id”, :null => false

role.rb model:
class Role < ActiveRecord::Base
has_and_belongs_to_many :users

attr_protected :role_type

user.rb model:
class User < ActiveRecord::Base
acts_as_authentic do |c|
c.logged_in_timeout = 10.minutes
c.login_field = :email
has_and_belongs_to_many :roles
belongs_to :dealer

def role_symbols
roles.map do |file|

attr_accessible :email, :password, :password_confirmation, :first_name,
:middle_name, :last_name


The user is being created here:
@dealer = Dealer.new(params[:dealer])
@user = @dealer.users.create(params[:user].merge(:role_id => 3)

Every field is created without error except the join table is left
blank always. If i call:
@user.role.create it will successfully create a new role (with a blank
name which is bad) and a join table row. Other then that the join
table is always empty.

Any suggestions. I’ve run out of things to try.


I dont use HABTM much myself, however I dont think this line will
@user = @dealer.users.create(params[:user].merge(:role_id => 3)

Try something like this instead:
@dealer = Dealer.create(params[:dealer])
@user = @dealer.users.new(params[:user])
@user.roles << Role.find(3)

Hey Sharagoz,

Thanks a lot. It worked exactly as desired. Now I was lead to believe
that the habtm relationship would be created automagically when the
user object is created. Why is it we had to explicitly define it like

Thanks a lot!

If ActiveRecord were to know that it’s supposed to create an habtm
association to another object simply because a foreign_key is present
in the attributes hash of the new object, then I think that would
create a lot of overhead in the create method, and it’s a bit too much
magic in my opinion. On every create it would need to check the
attributes hash for *_id attributes, then check if any habtm
associations matches that, and if so create the record in the join
table. Or a reverse version of that where it checks for habtm
relations first. It’s possible but that’s not how it has been