У меня есть код, который обновляет свойство модели, затем вызывает save!
.Вызов Rails.logger.info
показывает, что модель считает, что она имеет новые значения.Но запись SQL, выполняемая вызовом save!
, записывает старое значение в базу данных.
Сначала я вообще ничего не записывал в базу данных, когда я вызывал save!
.Я подумал, что объект не думал, что его значение изменилось по какой-то причине: changed?
вернул false, поэтому я использовал уведомление _will_change!
для принудительной записи.Но теперь он выполняет запись, но со старыми значениями.
Это не происходит из командной строки "rails console": там я могу обновить свойство, и оно вернет changed?
истины, и позвольте мне сохранить успешно.
Далее следует выдержка из журнала сервера.Обратите внимание, что объект считает, что он имеет log_ids
из '1234,5678,1137' , но записывает в базу данных '1234,5678' .
текущие лог-идентификаторы [1234, 5678]
новые лог-идентификаторы [1234, 5678, 1137];запись log_id '1234,5678,1137' в NewsList 13 с грязной истиной
SQL (2.0ms) UPDATE "news_lists" SET "log_ids" = '1234,5678', "updated_at" = '2012-01-02 02: 12: 17.612283 'WHERE ("news_lists". "Id" = 13)
Рассматриваемое свойство объекта - log_ids
, которое представляет собой строку, содержащую несколько идентификаторов объекта другого типа.
Исходный код, который привел к выводу выше:
def add_log(new_log)
new_ids = get_log_ids
Rails.logger.info("current log ids are #{new_ids}")
if new_ids.length >= NewsList.MAX_LENGTH
new_ids.shift
end
log_ids_will_change!
new_ids.push new_log.id
log_ids = new_ids.join ","
Rails.logger.info("new log ids are #{new_ids}; writing log_ids of '#{log_ids}' to NewsList #{id} with dirty #{changed?}")
save!
end
def get_log_ids
if log_ids
log_ids.split(",").map &:to_i
else
[]
end
end
Кто-нибудь может подсказать, что здесь может происходить?