在访问引用的文档后,模型的回调被触发。这是奇怪的行为,我不确定为什么会这样。
这是一个可重复的例子:
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
会触发添加回调并且是否有正确的解决方法?