Sti Insheiritance в Rails. Проблемы с поиском
-
18-09-2019 - |
Вопрос
У меня проблема с поиском записей в моей таблице ИППП из -за моей структуры наследования
class User < ActiveRecord::Base
class LegacyUser < User
class AuthUser < User
class SuperUser < AuthUser
class FieldUser < AuthUser
class ClientAdmin < AuthUser
Проблема в том, что Find не работает для модели Authuser. Запрос ищет тип «Authuser» и не включает в себя три других возможностей.
РЕДАКТИРОВАТЬ: Во время игры с этим он начал работать, но только для ClientAdmin и Fielduser, поэтому кажется, что эта функциональность должна быть встроена. Но теперь она вернулась к первоначальной проблеме
Решение
Я только что столкнулся с этой же проблемой и нашел решение здесь.
Короче говоря, проблема в том, что у вашего промежуточного абстрактного класса нет возможности узнать, каковы его подклассы до того, как они будут загружены. Чтобы обойти это, вы можете вручную загрузить все подклассы внизу файла этих классов.
Итак, в нижней части auth_user.rb:
require_dependency 'super_user'
require_dependency 'field_user'
require_dependency 'client_user'
Другие советы
Будет ли модель Authuser будет использоваться сама по себе?
Если это всего лишь класс для общих методов между унаследованными классами, вы можете попытаться установить его как абстрактный класс. Таким образом, Activerecord может пройти через это.
В объявлении Authuser просто добавьте self.abstract_class = true
как это:
class AuthUser < User
self.abstract_class = true
end
Я не знаю, работает ли это в этом сценарии, но это стоит попробовать.
Из -за того, как STI работает в Rails (он хранит имя модели в столбце базы данных, называемое «тип»), я не вижу, как она может поддерживать иерархию, которую вы описываете выше - я думаю, что вы ограничены иерархией одного уровня.