views:

553

answers:

1

I have a model Group and model User

They are connected both directions with "has_many :through => groups_users"

groups_users table has an attribute, called moderator, specifying whether a user is a moderator of the group

when i am trying to update join module attribute, i get a mistake

way i am doing it now:

@[email protected]_users.find_by_user_id(@user.id)

if @group_membership!=nil
 @group_membership.moderator=true
else
  @group_membership=GroupsUser.new(:user_id => @user.id, :group_id => @group.id, :moderator => true)
end

@group_membership.save

Code is producing mysql mistake:

 Unknown column 'id' in 'where clause': UPDATE `groups_users` SET `moderator` = 1 WHERE `id` = NULL

Is there nicer way to do that or should i add id column to the groups_users join model table and index it on id?

+3  A: 

Yes, you should create an id column on the groups_users table.

Since you are using has_many :through the join table should have an id column on it (which is an auto-incrementing primary key). This is because every Rails model needs an id column and the join table has its own model (GroupsUser). BTW, you may want to rename to something like Membership).

The other type of many-to-many association is has_and_belongs_to_many. I'm assuming you migrated from this because that does not use an id column on the join table. For more information about these two associations, check out my Railscasts episode on this topic.

ryanb