【问题标题】:Mongoid: 'update_attribute' with [models, ...] vs with [model_ids, ...]Mongoid:'update_attribute' 与 [models, ...] 与 [model_ids, ...]
【发布时间】:2015-08-21 01:41:39
【问题描述】:

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

调用时下面有什么区别:

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

.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

用户.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

希望我说得通,谢谢

【问题讨论】:

  • 我不明白你的测试。将其拆分为两个单独的测试用例,一个通过,另一个失败。

标签: ruby-on-rails rspec mongoid


【解决方案1】:
  1. 您的所有属性都正确列入白名单了吗?

没有模型的架构、您的连接对象和我正在​​抓住的实际测试,但纯粹基于该示例,我的猜测是第一个模型包含一个映射到您的意外字段的属性第二个模型,并在您传递整个对象时覆盖它,而不是在您指定要更新的属性时。这是一个例子:(我不是假设你忘记了你的连接表,我只是使用它,因为它首先浮现在脑海中)

所以我们创建了 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_ids 匹配新值时才会中断。

或者某个属性没有被列入白名单,或者您的测试有问题。

【讨论】:

  • 为了更直接地回答您的问题,下面没有区别。不同之处在于您提供的内容:在一种情况下,您只传递单个属性,而在另一种情况下,您正在传递属性的集合。
  • 这回答了您的问题吗?我可以拿到支票吗?
猜你喜欢
  • 2011-02-16
  • 2012-12-08
  • 2017-07-07
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多