有没有办法在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
方法吗?
答案 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