Mongoid中的奇怪行为:访问引用模型时触发了after_add回调

时间:2014-10-28 16:37:48

标签: ruby ruby-on-rails-3 mongodb sinatra mongoid

在访问引用的文档后,模型的回调被触发。这是奇怪的行为,我不确定为什么会这样。

这是一个可重复的例子:

class Group
    include Mongoid::Document
    include Mongoid::Timestamps

    belongs_to :domain_group, :class_name => 'Domain', :inverse_of => :child_groups

    field :name
end

class Domain < Group

    has_many :child_groups, :class_name => 'Group', :inverse_of => :domain_group, after_add: :print_childgroup

    field :sid

    def print_childgroup(group)
        puts 'calling print_childgroup()'
    end
end

路线处理:

get "/temp_init" do
    d = Domain.create(name: 'Domain', sid: '23Asdfai9')
    Group.create(name: 'group1', domain_group: d)
    Group.create(name: 'group2', domain_group: d)
end

get "/view" do
    g = Group.where(name: 'group1').first
    d = g.domain_group
end

要看到它的实际效果:

  • 访问/temp_init以创建种子值和控制台节目:

    calling print_childgroup()
    calling print_childgroup()
    

    这是预料之中的,因为我们刚刚添加了两个组,因此after_add回调会被触发两次。

  • 访问/view,控制台输出将显示:

    calling print_childgroup()
    

    这不是预期的

    违规行为g.domain_group,由于某种原因会触发after_add回调。

我目前的解决方法是:

# Grab the domain group id
d_id = g.domain_group_id

d = Domain.find(d_id)
# Do stuff with d object

哪个有效,但它很难看,似乎正在进行额外的查询。为什么g.domain_group会触发添加回调并且是否有正确的解决方法?

0 个答案:

没有答案