Ответ 1
def name=(projectname)
self[:name] = projectname.capitalize
end
Есть ли способ переопределить сеттер или getter для модели в Mongoid? Что-то вроде:
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
может быть перезаписан без использования виртуальных полей?
def name=(projectname)
self[:name] = projectname.capitalize
end
лучше использовать
def name=(projectname)
super(projectname.capitalize)
end
метод
self[:name] = projectname.capitalize
может быть опасным, причиной перегрузки с ним может стать бесконечная рекурсия
У меня была аналогичная проблема с необходимостью переопределить "пользовательский" сеттер для отношения owner_to: user. Я придумал это решение не только для этого случая, но и для упаковки любого метода, уже определенного в одном классе.
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