2

您将如何在 Mongoid 关系上实现空对象模式?

Class Owner
  include Mongoid::Document
  embeds_one :preference
end

大多数所有者不会有偏好,因此我希望他们有一个 NullPreference,如 Ben Orenstein 的精彩演讲中所述。

我想要的是这样的:

class NullPreference
  def name
    'no name'
  end 
end

owner = Owner.new
preference = owner.preference
preference.name
=> 'no name' 

我在 ActiveRecord 中发现了一个关于同一事物的相关问题,但没有答案。

编辑:我使用的是 Mongoid 2.6,否则我可以使用autobuild: true并获得一个真实的 Preference并使用默认值。

4

1 回答 1

1

一个明显的方法是在该字段上构建一个抽象层。

class Owner
  include Mongoid::Document
  embeds_one :preference_field # internal field, don't use directly

  def preference
    preference_field || NullPreference.new
  end

  def preference= pref
    self.preference_field = pref
  end
end

也许有更简单的方法。

于 2013-03-05T18:27:37.227 回答