Mongoid пользовательские сеттеры / геттеры и супер - PullRequest
3 голосов
/ 15 июля 2011

Я пытаюсь изменить установщик для модели Mongoid атрибутов, но в отличие от ActiveRecord, я не могу вызвать super, чтобы Mongoid фактически устанавливал атрибут, так как модель использует include Mongoid::Document, а не подкласс ActiveRecord::Base.

Я хочу быть в состоянии сделать что-то подобное.

class User
    include Mongoid::Document

    embeds_one :email_account

    def email_account=(_email_account)
        ret = super
        puts "email account updated!"
        do_something
        ret
    end
end

за исключением того, что это не подкласс, дает

NoMethodError: super: no superclass method

Идеи?

РЕДАКТИРОВАТЬ:

Как бы вы сделали геттер, как

class User
    include Mongoid::Document

    embeds_one :email_address

    def email_address
        super || "myself@gmail.com"
    end
end

Ответы [ 2 ]

1 голос
/ 15 июля 2011

По моему мнению, то, что вы делаете, совсем не относится к пользовательской модели.Я бы создал другой метод в модели EmailAccount и подключил бы его к обратному вызову after_save.

class EmailAccount
  include Mongoid::Document

  embedded_in :user

  after_save :do_something

  def do_something
    puts "email account updated!"
    do_actual_something
  end
end

Другой способ - использовать наблюдателей http://mongoid.org/docs/callbacks/observers.html

0 голосов
/ 15 июля 2011

Если это встроенный документ, вы можете сделать что-то в строках:

def doc=(_doc)
  self.build_doc(_doc.attributes)
end

Я пробовал его в консоли, но не пытался сохранить и получить его обратно. Если родитель - новая запись, сохранение должно быть без проблем, в противном случае вам, возможно, придется посмотреть, как вызвать сохранение во встроенном документе.

...