Вопрос

У меня проблема с поиском записей в моей таблице ИППП из -за моей структуры наследования

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 (он хранит имя модели в столбце базы данных, называемое «тип»), я не вижу, как она может поддерживать иерархию, которую вы описываете выше - я думаю, что вы ограничены иерархией одного уровня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top