如何更新has_many:通过Rails中的连接模型属性?

时间:2009-08-17 17:36:01

标签: ruby-on-rails has-many-through

我有一个模型组和模型用户

它们通过“has_many:through => groups_users”

连接到两个方向

groups_users表有一个名为主持人的属性,指定用户是否是该组的主持人

当我尝试更新加入模块属性时,我得到一个错误

我现在正在这样做:

@group_membership=@group.groups_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

代码正在产生mysql错误:

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

有没有更好的方法可以做到这一点,还是应该将id列添加到groups_users连接模型表并将其编入id?

1 个答案:

答案 0 :(得分:5)

是的,您应该在groups_users表上创建一个id列。

由于您使用的是has_many :through,因此连接表上应该有一个id列(这是一个自动递增的主键)。这是因为每个Rails模型都需要一个id列,而连接表有自己的模型(GroupsUser)。顺便说一句,您可能想要重命名为会员资格。

另一种类型的多对多关联是has_and_belongs_to_many。我假设您已从此迁移,因为会在联接表上使用id列。有关这两个关联的更多信息,请查看关于此主题的Railscasts episode