我正在尝试从after_initialize回调中引用嵌入文档的父对象。
这是我的设置的模型:
require 'mongo'
require 'mongoid'
connection = Mongo::Connection.new
Mongoid.database = connection.db('playground')
class Person
include Mongoid::Document
embeds_many :posts
end
class Post
include Mongoid::Document
after_initialize :callback_one
embedded_in :person, :inverse_of => :post
def callback_one
puts "in callback"
p self.person
end
end
这会导致我不想要的行为:
a = Person.new
a.posts.build
puts "after callback"
p a.posts.first.person
吐出来:
[d][Moe:~]$ ruby test.rb
in callback
nil
after callback
#<Person _id: 4e57b0ecba81fe9527000001, _type: nil>
要获得所需的行为,我可以手动执行此操作:
b = Person.new
c = Post.new(person: b)
puts "after callback"
p c.person
给了我:
d][Moe:~]$ ruby test.rb
in callback
#<Person _id: 4e57b386ba81fe9593000001, _type: nil>
after callback
#<Person _id: 4e57b386ba81fe9593000001, _type: nil>
唯一的问题是,每当从DB加载对象时它都不起作用,在这种情况下,人们会认为person
已经被设置,因为它是从人加载的,但事实并非如此。
是否有人知道这是否是所需的行为,如果是,你可以告诉我为什么吗? 如果这不是理想的行为,有人可以告诉我一个解决方法吗?
答案 0 :(得分:1)
Mongoid v2.2.0已于昨天发布,但仍未包含来自#900的补丁。所以没有简单的方法可以做到这一点。
根据您的使用情况,延迟加载可能已经足够了:
class Post
include Mongoid::Document
embedded_in :person, :inverse_of => :post
# This won't work yet.
#
# after_build :init
#
# def init
# @xyz = person.xyz
# end
def xyz
@xyz ||= person.xyz
end
def do_something
xyz.do_some_magic
end
end