egoholic/quasar — Issue #12: Прозрачная работа с properties на основе method_missing
Author: galymzhan
Created: 2012-03-09 15:47:45+00:00
State: open
Labels: enhancement

Предлагаю немножко переписать Document для прозрачной работы с properties. Т.е. нужно чтобы работа с properties не отличалась от работы с обычными атрибутами ActiveRecord'а.

Сейчас геттеры и сеттеры добавляются только для предопределенных свойств (predefined properties). Нужно чтобы они добавлялись и для динамически создаваемых свойств. Сделать это мне кажется лучше так:

* при создании экземпляра какого-нибудь документа ему в initialize добавляются дефолтовые свойства определенные с помощью has_predefined_property. Эти дефолтовые свойства сохранятся в базу с дефолтовыми значениями если ничего не менять
* далее чтобы добавить динамическое свойство, просто вызываем

```
a = Article.create ... # создали инстанс документа
a.properties.build name: 'another_property', type: 'string', value: 'bla' # добавили динамическое свойство, его имя another_property
```

* после этого в след. строках кода мы можем менять и считывать значение этого свойства

```
a.another_property # => 'bla'
a.another_property = 'changed'
```

* реализовано это будет через method_missing, который просто будет смотреть в список свойств. Еще можно прямо там define_method'ом определить отсутствующий метод (что теоретически должно дать небольшой прирост)

* надо убрать нынешний метод define_property_accessors, заменив его реализацией с использованием method_missing

Сейчас define_method вызывается для каждого инстанса создаваемого документа, в случае с method_missing методы определятся лишь на уровне класса.