Доступ к ресурсу внутри load/dump

Рассмотрим следующий пример

module DataMapper
  class Property
    class CustomType < DataMapper::Property::Text

      def load(value)
        # do stuff and return formatted value 
      end
    end  
  end
end

Class A
  property :name, String
  property :value, CustomType
end

теперь, когда я делаю A.first или же A.first.value load метод выполняется, но вычисления, которые мне нужно сделать внутри load зависит от этого экземпляра name имущество. Так как же получить контекст этого экземпляра / ресурса (как указано в исходном коде) внутри метода load?

Пожалуйста, дайте мне знать, если вопрос еще не ясен!

1 ответ

Вы пытаетесь нарушить инкапсуляцию. name а также value это разные свойства, и поэтому каждый должен быть в неведении о существовании другого, не говоря уже о ценности.

Правильное решение - переместить "материал" в объект, который имеет видимость над обоими свойствами. Два варианта:

  1. A класс (как предложено пользователем user1376019); или же
  2. сложный тип данных, например NameAndValue < DataMapper::Property::Object, который инкапсулирует оба свойства.

Если вам нужно выполнить агрегатные функции над отдельными свойствами, второй вариант не будет работать, если вы не можете каким-то образом переопределить сложное свойство, чтобы иметь несколько полей.

В любом случае значение не может ссылаться на имя без ссылки на него.

Другие вопросы по тегам