Могу ли я заставить ActiveRecord сохранить модель при изменении строкового поля на месте? - PullRequest
9 голосов
/ 06 декабря 2011

У меня есть модель ActiveRecord с длинным строковым полем. На самом деле, эта строка представляет собой массив, который я хотел бы изменить на месте вместо копирования всей строки.

Например, скажем, Somemodel имеет строковое поле array. Тогда не удается сохранить следующее:

m = Somemodel.first
m.array[someindex] = somevalue
m.save

На самом деле, save возвращает true, поскольку, кажется, проверяет, что array имеет тот же object_id, и решает, что модель не изменилась, и пропускает туда-обратно в базу данных.

Я использовал следующий обходной путь:

m = Somemodel.first
a = String.new(m.array) # remember, the array is represented as a string
a[someindex] = somevalue
m.array = a
m.save

Обратите внимание, что m.array должен быть установлен после изменения его значения, потому что save смотрит на значение, а не только object_id.

Это кажется громоздким И требует, чтобы была скопирована вся строка. Не подходит для большого массива. Могу ли я сказать save обойти эти проверки с измененной моделью без предшествующих проверочных тестов?

Ответы [ 2 ]

13 голосов
/ 06 декабря 2011

Возможно, это то, что вы ищете: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html:

Если атрибут изменен на месте, используйте [имя_атрибута] _will_change! отметить>, что атрибут меняется.

0 голосов
/ 14 февраля 2015

Да, реализуйте метод хеширования на ваших объектах.

https://github.com/rails/rails/pull/15458

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...