Mongoid定制的setter / getters和super

时间:2011-07-14 20:26:54

标签: ruby ruby-on-rails-3 mongoid setter getter

我正在尝试修改Mongoid模型属性的setter,但与ActiveRecord不同,我不能调用super来让Mongoid实际设置属性,因为模型使用include Mongoid::Document而不是ActiveRecord::Base的子类1}}。

我希望能够做到这样的事情。

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 个答案:

答案 0 :(得分:1)

在我看来,你所做的事情根本不属于用户模型。我将在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

答案 1 :(得分:0)

如果是嵌入式文档,您可以执行以下操作:

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

我在控制台中尝试了它,但没有尝试保存并将其检索回来。如果父项是新记录,则保存应该没有问题,否则您可能需要研究如何在嵌入式文档上调用保存。