Мое приложение имеет пользовательскую модель с некоторыми простыми проверками уровня доступа.Этот уровень доступа определяет объем доступа к другим моделям в базе данных.Если быть точным, у меня есть модели района, школы, учителя, комнаты и ученика.Администратор может видеть все записи, округ может видеть все детские школы, учителей, комнаты и учащихся, директор может видеть всех детских учителей, комнаты и учащихся, учитель может видеть все детские комнаты и учащихся.
Этоэто делается путем связывания объекта User с одним или несколькими уровнями моделей.
belongs_to :district
belongs_to :school
belongs_to :teacher
Таким образом, у директора школы будет идентификатор района и идентификатор школы, но идентификатор учителя будет равен нулю.
Доступ к дочерним элементам контролируется с помощью таких функций:
def teachers
if is_admin?
Teacher.all
elsif is_district_head?
district.teachers
elsif is_principal?
school.teachers
else
[ teacher ]
end
end
Эта функция обрабатывается в коде, как если бы это были простые старые отношения has_many, где мы можем выполнять такие вещи, как:
current_user.teachers.find param[:teacher_id]
current_user.teachers.each {|t| puts t.id }
Независимо от того, является ли current_user администратором, учителем или чем-то промежуточным, возвращается правильное количество учителей.
За исключением этого, к сожалению, это не так.Только фактические отношения has_many работают полностью, мои поддельные сбой, когда я пытаюсь использовать .find или какую-то функцию, специфичную для коллекций ActiveRecord, созданных has_many.
Итак, к моему вопросу.Как я могу вернуть объект коллекции ActiveRecord без явного вызова функции has_many?
Если вы думаете, что я чертовски умственно отсталый, и я упускаю что-то чертовски очевидное, пожалуйста, не стесняйтесь просветить меня!Я думал, что эта система работает отлично, пока мне не пришлось использовать .find для учетной записи уровня администратора.По сути, он работал
Teacher.all.find :conditions => 'xyz'
... и это, к сожалению, возвращает объект Enumerator вместо ActiveRecord для модели учителя.