Rails 3: object.save записывает старые значения в базу данных - PullRequest
0 голосов
/ 02 января 2012

У меня есть код, который обновляет свойство модели, затем вызывает 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

Кто-нибудь может подсказать, что здесь может происходить?

1 Ответ

3 голосов
/ 02 января 2012

Добавьте self к self.log_ids = new_ids.join ",", иначе вы просто будете назначать локальную переменную (тезка) вместо атрибута db-persisted (столбец).

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