Сохранение обновлений для объектов в рельсах - PullRequest
4 голосов
/ 15 марта 2009

Я пытаюсь обновить один из моих объектов в приложении rails, и изменения просто не сохраняются. Ошибок нет, и отладчик показывает, что все обновляется.

В любом случае, вот код, о котором идет речь ...

  qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id])
  qm.position = x
  qm.save

Для справки у QuestionMembership есть поля question_id, form_id и position. Все являются целыми числами и не имеют ограничений в БД.

Это в основном моя таблица соединения форм и вопросов.

Выполняя код, qm получает действительный объект, позиция объекта изменяется на значение x, а save возвращает true.

Однако после выхода из метода объект в БД не изменяется.

Чего мне не хватает?

Ответы [ 11 ]

8 голосов
/ 15 марта 2009

Возможно, вы не находите объект, которым себя считаете. Некоторые эксперименты в irb могут быть поучительными.

Также, как правило, при изменении только одного атрибута лучше написать

qm.update_attribute(:position, x)

вместо настройки и сохранения. Rails будет обновлять только этот столбец вместо всей строки. И вы также получаете выгоду от очистки данных.

1 голос
/ 10 июня 2011

Либо обновите атрибут, либо позвоните:

qm.reload

после qm.save

1 голос
/ 16 марта 2009

В журнале разработки вы можете увидеть созданный sql.

Примерно так:

qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id])
qm.position = x
qm.save

Вы должны увидеть что-то с эффектом:

SELECT * FROM question_memberships WHERE question_id=2 AND form_id=6 LIMIT 1
UPDATE question_memberships SET position = x WHERE id = 5

Можете ли вы вывести, какой sql вы на самом деле видите, чтобы мы могли сравнить?

1 голос
/ 15 марта 2009

Есть ли после_сохранение?

Правильно ли выводится SQL?

0 голосов
/ 19 марта 2009

Оказывается, что он испускал неправильный SQL. По сути, он искал объект QuestionMembeship по столбцу id, который не существует.

У меня сложилось впечатление, что в этом столбце нет необходимости в отношениях has_many_through, хотя, похоже, я ошибался.

Чтобы исправить, я просто добавил столбец id в таблицу в качестве первичного ключа. Спасибо за все указатели.

0 голосов
/ 19 марта 2009

Убедитесь, что настройки вашей базы данных верны. Если вы работаете с несколькими базами данных (или не изменили базу данных sqlite3 по умолчанию на MySQL), возможно, вы работаете с неверной базой данных.

Запустите команды в ./script/console, чтобы увидеть, видите ли вы то же поведение.

Убедитесь, что аналогичный объект (скажем, форма или вопрос) сохраняется.

Если форма или вопрос сохраняются, найдите разницу между объектами QuestionMembership и Form или Question.

0 голосов
/ 17 марта 2009

Проверьте ваш класс QuestionMembership и убедитесь, что позиция не имеет что-то вроде

 attr_readonly :position

Лучший способ отладить это - сделать

 tail -f log/development.log

А затем откройте другую консоль и выполните код, выполняющий оператор сохранения. Убедитесь, что фактический оператор SQL Update выполнен.

0 голосов
/ 16 марта 2009

Используйте ./script/console и запустите этот скрипт .. шаг за шагом ..

посмотреть, будет ли поле позиции для объекта обновляться или нет при запуске строки 2

затем нажмите qm.save или qm.save! ... чтобы проверить

посмотри что получится. Также как упомянуто Тимом .. проверьте журналы

0 голосов
/ 15 марта 2009

Я сталкивался с этой проблемой довольно часто. (Я собирался сказать последовательно, но не могу, поскольку это означало бы, что я буду знать, когда это должно было произойти.)

Хотя у меня нет решения основной проблемы, я обнаружил, что это происходит со мной только тогда, когда я пытаюсь обновить mysql text поля. Мой обходной путь - настроить поле на что-то вроде:

qm.position = ""
qm.save
qm.position = x
qm.save

И отвечать всем остальным ... когда я запускаю qm.save!, я не получаю ошибок. Я не пробовал qm.save?

Когда я запускаю свой код в консоли rails, все работает отлично, о чем свидетельствует повторный поиск объекта с использованием того же запроса, который дает ожидаемые результаты.

У меня такая же проблема при использовании qm.update_attribute(..., а также

Мой обходной путь заставил меня хромать так далеко, но, надеюсь, кто-то в этой теме сможет помочь.

0 голосов
/ 15 марта 2009

Каков результат qm.save? Правда или ложь? А что насчет qm.errors, это дает вам что-то, что имеет смысл? А что говорит development.log?

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