Доступ к ресурсу внутри 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
это разные свойства, и поэтому каждый должен быть в неведении о существовании другого, не говоря уже о ценности.
Правильное решение - переместить "материал" в объект, который имеет видимость над обоими свойствами. Два варианта:
A
класс (как предложено пользователем user1376019); или же- сложный тип данных, например
NameAndValue < DataMapper::Property::Object
, который инкапсулирует оба свойства.
Если вам нужно выполнить агрегатные функции над отдельными свойствами, второй вариант не будет работать, если вы не можете каким-то образом переопределить сложное свойство, чтобы иметь несколько полей.
В любом случае значение не может ссылаться на имя без ссылки на него.