ruby-on-rails - references - ruby activerecord without rails




Как узнать, почему я не смог#destroy() записать? (3)

Вы должны добавить некоторую отладочную информацию, например logger.debug, и посмотреть свои файлы журналов. например log / production.log, если вы работаете в режиме производства и т. д., и вы должны быть в состоянии выяснить, почему. Если нет, вы можете опубликовать соответствующий раздел файла журнала (например, действие, которое вы выполняете) здесь, и мы можем вам помочь.

person = Person.find(4123)
person.destroy #=> false

Какие способы я могу выяснить, почему запись не была удалена? Модель имеет две проверки, оба триггера только для создания. Он имеет один обратный вызов, но обратный вызов не блокируется, если он терпит неудачу.

У меня нет следов или ошибок.


Какую версию Rails вы используете? В Rails 4 вы можете принудительно уничтожить, используя person.destroy! , Если действие не удастся, отобразится трассировка.


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

Во-первых, для класса объекта, который я пытаюсь уничтожить, я запустил это, чтобы выяснить, что все ассоциации заданы как dependent: :destroy :

ary = Klass.reflect_on_all_associations
           .select { |a| a.options[:dependent] == :destroy }
           .map(&:name)

Затем я назвал каждую из ассоциаций, названных в ary на моем объекте, и собрал результаты. Это ограничивает имена ассоциаций только теми, у которых есть зависимые объекты:

ary.select! { |a| obj.send(a).any? }

Затем я могу попытаться уничтожить каждый из объектов, возвращаемых этими именами ассоциаций:

destroy_me = obj.send(ary[0]).first
destroy_me.destroy

У меня был только один объект, поэтому выше было достаточно, чтобы разрушить разрушение. Затем я мог посмотреть на ошибки на объекте, который не удалось уничтожить:

destroy_me.errors

И вот где я наконец увидел ошибку, которая заставляла разрушение терпеть неудачу. Оттуда это было простое программирование (SMOP), чтобы решить проблему.

В моем случае был before_destroy вызов before_destroy предотвращающий уничтожение от работы над одной из зависимых ассоциаций объектов. Чтобы сделать это проще для отладки в будущем, я решил начать регистрацию ошибки в журнале Rails при неудачных обратных errors.base (в дополнение к добавлению сообщения об ошибке на errors.base ).







activerecord