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
implemented.

On May 18, 10:09 pm, brianp <brian.o.pea...@gmail.com> wrote:
> 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
> this?
>
> Thanks a lot!
> -brianp
>
> On May 18, 5:48 am, Sharagoz <shara...@gmail.com> wrote:
>
>
>
> > I dont use HABTM much myself, however I dont think this line will
> > work:
> > @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)
> > @user.save
>
> > On May 18, 12:22 pm, brianp <brian.o.pea...@gmail.com> wrote:
>
> > > 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.
>
> > > DB:
> > >   create_table "roles", :force => true do |t|
> > >     t.string   "role_type"
> > >     t.datetime "created_at"
> > >     t.datetime "updated_at"
> > >   end
>
> > >   create_table "roles_users", :id => false, :force => true do |t|
> > >     t.integer "role_id"
> > >     t.integer "user_id"
> > >   end
>
> > >   add_index "roles_users", ["role_id"], :name =>
> > > "index_roles_users_on_role_id"
> > >   add_index "roles_users", ["user_id"], :name =>
> > > "index_roles_users_on_user_id"
>
> > >   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
> > > end
>
> > > user.rb model:
> > > class User < ActiveRecord::Base
> > >   acts_as_authentic do |c|
> > >     c.logged_in_timeout = 10.minutes
> > >     c.login_field = :email
> > >   end
> > >   has_and_belongs_to_many :roles
> > >   belongs_to :dealer
>
> > >   def role_symbols
> > >     roles.map do |file|
> > >       role.name_underscore.to_sym
> > >     end
> > >   end
>
> > > attr_accessible :email, :password, :password_confirmation, :first_name, 
> > > :middle_name, :last_name
>
> > > end
>
> > > The user is being created here:
> > > �...@dealer = Dealer.new(params[:dealer])
> > > �...@dealer.save!
> > > �...@user = �...@dealer.users.create(params[:user].merge(:role_id => 3)
> > > �...@dealer.addresses.create(params[:mailing_address])
>
> > > 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.
>
> > > cheers,
> > > brianp
>
> > > --
> > > You received this message because you are subscribed to the Google Groups 
> > > "Ruby on Rails: Talk" group.
> > > To post to this group, send email to rubyonrails-t...@googlegroups.com.
> > > To unsubscribe from this group, send email to 
> > > rubyonrails-talk+unsubscr...@googlegroups.com.
> > > For more options, visit this group 
> > > athttp://groups.google.com/group/rubyonrails-talk?hl=en.
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "Ruby on Rails: Talk" group.
> > To post to this group, send email to rubyonrails-t...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > rubyonrails-talk+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/rubyonrails-talk?hl=en.
>
> --
> You received this message because you are subscribed to the Google Groups 
> "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonrails-t...@googlegroups.com.
> To unsubscribe from this group, send email to 
> rubyonrails-talk+unsubscr...@googlegroups.com.
> For more options, visit this group 
> athttp://groups.google.com/group/rubyonrails-talk?hl=en.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to