Монгоидная ассоциация и шаблон нулевого объекта?

Как бы вы реализовали шаблон нулевого объекта в отношении Mongoid?

Class Owner
  include Mongoid::Document
  embeds_one :preference
end

У большинства владельцев нет предпочтений, и поэтому я хочу, чтобы вместо них у них была NullPreference, как описано в превосходном выступлении Бена Оренштейна.

Я хотел бы что-то вроде этого:

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 и вместо этого используйте значения по умолчанию.

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

Может быть, есть более простые способы.

Другие вопросы по тегам