Переопределить сеттеры и геттеры монгоидной модели - PullRequest
12 голосов
/ 05 сентября 2011

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

Ответы [ 3 ]

24 голосов
/ 06 сентября 2011

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

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

метод

self[:name] = projectname.capitalize

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

16 голосов
/ 05 сентября 2011
def name=(projectname)
  self[:name] = projectname.capitalize
end
1 голос
/ 23 апреля 2012

У меня была похожая проблема с необходимостью переопределить «пользовательский» сеттер для отношения отношение к пользователю. Я придумал это решение не только для этого случая, но и для упаковки любого метода, уже определенного в том же классе.

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
...