Mongoid:'update_attribute' 与 [models, ...] 对比 [model_ids, ...]

Mongoid: 'update_attribute' with [models, ...] vs with [model_ids, ...]

我正在编写一些测试,我 运行 进入了我试图理解的东西。

下面调用有什么区别:

.update_attributes(:group_ids, [group1.id, group2.id])

.update_attributes(:groups, [group1, group2])

有问题的这 2 个模型:

group.rb

class Group
  include Mongoid::Document
  has_and_belongs_to_many :users, class_name: "Users", inverse_of: :groups
end

user.rb

class User
  include Mongoid::Document
  has_and_belongs_to_many :groups, class_name: "Group", inverse_of: :users
end

有问题的测试代码:

g1 = create(:group)
u1 = create(:user, groups: [g1])
g1.update_attribute(:users, [u1])
# at this point all the associations look good
u1.update_attribute(:group_ids, [g1.id])
# associations looks good on both sides when i do u1.reload and g1.reload
u1.update_attribute(:groups, [g1])
# g1.reload, this is when g1.users is empty and u1 still has the association

希望我说得有道理,谢谢

  1. 您的所有属性是否正确列入白名单?

没有模型的模式、您的连接对象和我正在​​掌握的实际测试,但纯粹基于该示例,我的猜测是第一个模型包含映射到非预期字段的属性在您的第二个模型上,并在传递整个对象时覆盖它,但在您指定要更新的属性时不会覆盖它。下面是一个例子:(我不是假设你忘记了你的加入 table,我只是使用它因为它是第一个想到的东西)

所以我们创建了 2 个模型,每个模型都有一个映射到 user_id

的字段
group.create(id:1, user_id:null)
group_user.create(id:1, group_id: 1, user_id:null)

group.update_attributes(user_id: (group_user.id)) 

所以此时,当您调用 group.users 时,它会检查 ID 为 1 的用户,因为这是您刚刚创建并传递给它的 group_user 的 ID,并假设如果您的数据库中有一个具有该 ID 的用户,则测试通过。

group_user.update_attributes(group_id: group.id) 

在这种情况下,该方法仅更新 group_id,因此一切仍然有效。

group_user.update_attributes(group_id: group, user_id: group) 

在这种情况下,您传递了整个对象,并将其留给方法来决定更新哪些字段。我的猜测是您的组模型中的某些属性正在覆盖您的用户模型中的相关属性,导致它仅在没有 user_id 匹配新值时才中断。

或者某个属性未列入白名单,或者您的测试不可靠。