gpt4 book ai didi

ruby-on-rails - Mongoid: 'update_attribute' 与 [models, ...] 与 [model_ids, ...]

转载 作者:行者123 更新时间:2023-12-04 12:40:23 26 4
gpt4 key购买 nike

我正在编写一些测试,但遇到了一些我试图理解的问题。

调用时下面有什么区别:

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

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

这两个模型有问题:

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

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

希望我说的有道理,谢谢

最佳答案

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

  • 没有模型的模式、你的连接对象和我正在​​掌握的实际测试,但纯粹基于那个例子,我的猜测是第一个模型包含一个映射到第二个模型上意外字段的属性,并在传递整个对象时覆盖它,但在指定要更新的属性时不会覆盖它。这是一个例子:(我不是假设你忘记了你的连接表,我只是使用它,因为它是我想到的第一件事)

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

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

    关于ruby-on-rails - Mongoid: 'update_attribute' 与 [models, ...] 与 [model_ids, ...],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32131077/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com