Модель Rails не загружается должным образом - PullRequest
0 голосов
/ 05 марта 2020

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

Эта модель является задачей и основана на наследовании одной таблицы:

class Activity < ActiveRecord::Base
(...)
end

class Task < Activity
(...)
end

class Event < Activity
(...)
end

class Phase < Activity
(...)
end

Вот что ожидается, когда модель загружена правильно и все работает хорошо (та же модель из-за STI):

Activity.inspect       => Activity(id: integer, type: string, project_id: integer, author_id: integer, subject: text, description: text, (...), created_at: datetime, updated_at: datetime)
Task.inspect           => Task(id: integer, type: string, project_id: integer, author_id: integer, subject: text, description: text, (...), created_at: datetime, updated_at: datetime)
Event.inspect           => Event(same model as above ...)
(...)

Однако с момента обновления Rails вообще не может использовать модель Task, ни для чтения записи из базы данных, ни для создания новой. Другие связанные модели Event и Phase работают должным образом.

Когда я отлаживаю его в производственном режиме, проверяя класс Task и Task.first из контроллера задач # show, я получаю:

Task.inspect       => Task()
Task.first.inspect => #<Task >
Task.first.nil?    => false

Эта модель выглядит так, как будто она была недействительной. Другие модели загружены отлично.

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

Некоторые важные наблюдения :

  • Сбой возможен только в производственном режиме, но хорошо работает в режиме разработки или не работает только при config.cache_classes = true, но в остальном работает хорошо.
  • Хорошо работает в консоли Rails Файл модели.
  • task.rb загружается даже в некорректном контексте. Структура файлов модели плоская, все модели находятся в app / models /
  • . До обновления с Ruby 1.9.3 и Rails 3.1 до Ruby 2.3.8 и Rails 3.2.22 он хорошо работал.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Что-то глючит в отношении загрузки схемы Rails 3.2.22 и STI. Лучший обходной путь, который я нашел до сих пор, - это принудительная перезагрузка схемы для этой модели, используя:

Task.connection.schema_cache.clear!
Task.reset_column_information

Но тогда Rails теряет отслеживание STI и пропускает добавление поля «type» во вновь создаваемые записи. Поэтому для принудительного заполнения этих полей в каждом необходимом контроллере я добавил:

@task = (...).becomes(Task)

Это кажется хакерским, но я не мог найти лучшего способа. Может быть, этот совет поможет кому-то еще. В моем случае не было возможности обновить Rails дальше или изменить весь код, чтобы избавиться от STI.

0 голосов
/ 07 марта 2020

Это, вероятно, дубликат { ссылка }

Что-то еще определяет задачу - может быть, расширить ее. Не делай этого. Используйте prepend. В противном случае автозагрузчик найдет это непреднамеренное определение и не будет загружать то, которое вы намереваетесь.

Или Задача теперь также определяется чем-то, что вы включаете. Может быть интересно спросить о Task.superclass.

Возможно, это произошло потому, что Rails 6 изменил автозагрузчик.

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