覆盖Mongoid模型的setter和getter

时间:2011-09-05 09:59:54

标签: ruby mongoid

有没有办法在Mongoid中覆盖模型的setter或getter?类似的东西:

class Project
  include Mongoid::Document
  field :name, :type => String
  field :num_users, type: Integer, default: 0
  key :name
  has_and_belongs_to_many :users, class_name: "User", inverse_of: :projects

  # This will not work
  def name=(projectname)
    @name = projectname.capitalize
  end
end

可以在不使用虚拟字段的情况下覆盖name方法吗?

3 个答案:

答案 0 :(得分:24)

更好地使用

def name=(projectname)
  super(projectname.capitalize)
end

方法

self[:name] = projectname.capitalize

可能很危险,导致超载会导致无休止的递归

答案 1 :(得分:16)

def name=(projectname)
  self[:name] = projectname.capitalize
end

答案 2 :(得分:1)

我遇到类似的问题,需要覆盖belongs_to:user关系的“user”setter。我想出了这个解决方案,不仅适用于这种情况,还包含了在同一个类中定义的任何方法。

class Class  
  def wrap_method(name, &block)
    existing = self.instance_method(name)

    define_method name do |*args|
      instance_exec(*args, existing ? existing.bind(self) : nil, &block)
    end
end

这允许您在模型类中执行以下操作:

wrap_method :user= do |value, wrapped|
    wrapped.call(value)
    #additional logic here
end