我有两个由has_one
关系关联的模型。我们还有一个初始化关联的回调。这些类看起来(大致)是这样的:
class User
has_one :relevance, class_name: 'User::Relevance', inverse_of: :user, dependent: :destroy
after_create :initialize_relevance
def initialize_relevance
self[:relevance] = User::Relevance.new
end
# other garbage that *should* be irrelevant
end
class User::Relevance
belongs_to :user, inverse_of: :relevance, index: true
# more other garbage that *should* be irrelevant
end
有时,相关性关联会进入一个状态为零的状态。当发生这种情况时,我们希望在调用它时重新初始化关系并返回它而不是nil。所以在课程User
中,我们会有:
def relevance
self[:relevance] = User::Relevance.new if self[:relevance].nil?
self[:relevance]
end
除非这不起作用,否则仍会返回nil
。我也尝试使用update_attribute(User::Relevance.new)
和self.create_relevance
,但nil
似乎总是被返回。不确定从哪里开始,会喜欢任何想法。如果它有用,我还可以提供更多代码或示例。
其他详细信息:
relevance
的回调。答案 0 :(得分:1)
Mongoid支持自动构建一对一关系。这应该有所帮助(不需要钩子或吸气器覆盖)。
has_one :relevance,
class_name: 'User::Relevance',
inverse_of: :user,
dependent: :destroy,
autobuild: true
当选项名称提示时,relevance
将在访问时生效(如果在访问之前它是零)。
另外,你知道这种相关性不会持续存在,对吗?
after_create :initialize_relevance
def initialize_relevance
self[:relevance] = User::Relevance.new
end
所以难怪它稍后会返回nil
。
答案 1 :(得分:0)
您可以尝试在getter方法中构建relevance
,而不是在回调中设置关联:
class User
def relevance
self[:relevance] || User::Relevance.new
end
end
这里很好地描述了这种模式:http://blog.arkency.com/2016/07/always-present-association/