Метод 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