为什么我能够绕过<<<<<<<运营商?

时间:2015-01-27 22:06:47

标签: ruby-on-rails ruby rails-activerecord

以下是示例关系:

class User < ActiveRecord::Base
    has_one :group, through: :group_membership
    has_one :group_membership
end

class Group < ActiveRecord::Base
  has_many :users, through: :group_memberships
  has_many :group_memberships
end

class GroupMembership < ActiveRecord::Base
    belongs_to :group
    belongs_to :user
end

为什么我能够执行以下操作?

Group.first.users << User.first
Group.second.users << User.first

我原以为has_one关系会阻止这种情况发生。我不知道的<<背后是否​​有一些魔力?

User.first.group将返回第二组,但两个组都会保持不变。

1 个答案:

答案 0 :(得分:1)

如果您添加到关联的has_one方,User只能帮助您。当您使用has_one方法本身时(其中没有定义<<)。

在此获得所需内容的最佳方式是实际更改关联,使其成为belongs_to方面的User。然后User只能与单个Group相关联。您可以在user_id表的group_memberships字段中使用唯一的数据库索引实现类似的操作。