Добавление динамических атрибутов в модель Rails - PullRequest
0 голосов
/ 17 октября 2018

В более ранних версиях Rails было возможно добавлять динамические атрибуты в модель без необходимости наличия столбца SQL.Следующий код работал до 4.0.

drow = dtab1.drows.create()
drow.write_attribute('value1', 'xxx')
drow.write_attribute('value2', 'yyy')
drow.write_attribute('value3', 'zzz')

Но теперь в v5 я получаю:

ActiveModel::MissingAttributeError: can't write unknown attribute `value1`

Есть ли способ сделать это сейчас?

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

1 Ответ

0 голосов
/ 17 октября 2018

Метод write_attribute обновляет атрибут в базовой таблице.Поскольку ваши новые атрибуты являются динамическими и не совпадают с полями из таблицы модели, неудивительно, что они не работают.

Для динамического добавления атрибута вам необходимо сначала объявить его, а затем вызвать setter, как для обычного атрибута.Например:

attr_name = 'value1'

# Declaring attr_accessor: attr_name
drow.instance_eval { class << self; self end }.send(:attr_accessor, attr_name)

drow.send(attr_name + '=', 'xxx')   # setter
drow.send(attr_name)                # getter

Свойство будет сохранено в переменной экземпляра @value1.

Другой способ сохранить динамическое свойство - изменить эту переменную напрямую, без объявления атрибута accessor:

drow.instance_variable_set("@#{attr_name}".to_sym, 'xxx') # setter
drow.instance_variable_get("@#{attr_name}".to_sym)        # getter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...