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

时间:2015-08-21 01:41:40

标签: ruby-on-rails rspec mongoid

我正在写一些测试,但我碰到了一些我想要了解的东西。

致电时有什么区别:

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

VS

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

这两个模型有问题:

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 个答案:

答案 0 :(得分:3)

  1. 是否正确列出了所有属性?
  2. 没有模型的架构,你的连接对象,以及我在稻草上抓到的实际测试,但纯粹基于这个例子,我的猜测是第一个模型包含一个映射到非预期字段的属性在第二个模型上,并在传递整个对象时覆盖它,但在指定要更新的属性时不会覆盖它。以下是一个例子:(我不会假设你忘了你的联名表,我只是使用它,因为它首先浮现在脑海中)

    所以我们创建了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) 
    

    在这种情况下,您传递整个对象,并将其留给方法以确定哪些字段得到更新。我的猜测是,您的组模型中的某些属性会覆盖您的用户模型中的相关属性,导致它仅在NO user_ids与新值匹配时才会中断。

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