Rails 4 - STI с пространством имен - PullRequest
0 голосов
/ 18 сентября 2018

Если у меня есть 3 класса, как показано ниже:

class Parent < ActiveRecord::Base
end

class Child < Parent
end

class Another::Child < ::Child
end

Все эти 3 класса расположены в разных папках.

В консоли rails Child.first выполнить этот запрос SELECT parents.* FROM parents WHERE parents.type IN ('Child') ORDER BY parents.id ASC LIMIT 1.

После этого я запускаю Another::Child.first в консоли rails и генерируется этот запрос SELECT parents.* FROM parents WHERE parents.type IN ('Another::Child') ORDER BY parents.id ASC LIMIT 1.

После того, как я запустил обе команды в консоли rails, я снова запустил Child.first и запрос стал SELECT parents.* FROM parents WHERE parents.type IN ('Child', 'Another::Child') ORDER BY parents.id ASC LIMIT 1.

В чем причина этого?

Как последовательно вызывать третий запрос всякий раз, когда я запускаю Another::Child.first, учитывая, что Another::Child является дочерним классом Child?

1 Ответ

0 голосов
/ 18 сентября 2018

Поведение, которое вы описали, вызвано отложенной загрузкой ваших моделей Rails в режиме разработки (активная загрузка по умолчанию отключена для разработчика).Перед первым запуском Another::Child.first Another::Child еще не загружен.

Вы можете активировать загрузку во всех средах, добавив Rails.application.config.eager_load = true в файл инициализатора.

Причина, по которой не использует энергичную загрузку в разработке, заключается в том, что приложение может (повторно) загружаться намного быстрее.Однако я столкнулся со многими проблемами, когда активная загрузка отключена, особенно с моделями STI, которые вы используете.Это может стать головной болью для управления, и это может привести к ошибкам, поскольку среда разработки ведет себя иначе, чем производственная среда.По этим причинам я обычно рекомендую установить eager_load = true.

...