如何懒惰的Mongoid协会

时间:2016-09-12 19:44:26

标签: ruby-on-rails ruby mongoid

我有两个由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似乎总是被返回。不确定从哪里开始,会喜欢任何想法。如果它有用,我还可以提供更多代码或示例。

其他详细信息

  • 我们正在为我们的数据库使用mongoid。
  • 我们没有任何其他可能影响relevance的回调。

2 个答案:

答案 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/