Подтвердить что ты не робот

Переопределение монгольских модельных сеттеров и геттеров

Есть ли способ переопределить сеттер или 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 может быть перезаписан без использования виртуальных полей?

4b9b3361

Ответ 1

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

Ответ 2

лучше использовать

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

метод

self[:name] = projectname.capitalize

может быть опасным, причиной перегрузки с ним может стать бесконечная рекурсия

Ответ 3

У меня была аналогичная проблема с необходимостью переопределить "пользовательский" сеттер для отношения 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