Создание поддельного отношения has_many, которое зависит от некоторого другого члена var - PullRequest
1 голос
/ 11 января 2011

Мое приложение имеет пользовательскую модель с некоторыми простыми проверками уровня доступа.Этот уровень доступа определяет объем доступа к другим моделям в базе данных.Если быть точным, у меня есть модели района, школы, учителя, комнаты и ученика.Администратор может видеть все записи, округ может видеть все детские школы, учителей, комнаты и учащихся, директор может видеть всех детских учителей, комнаты и учащихся, учитель может видеть все детские комнаты и учащихся.

Этоэто делается путем связывания объекта 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 для модели учителя.

1 Ответ

0 голосов
/ 11 января 2011

Обычно у вас есть четыре роли (администратор, глава округа, директор и учитель (?)).У каждого пользователя есть одна из этих ролей, и у вас есть набор правил для определения прав доступа для каждой роли.Правильно?

Эта проблема была решена.Я призываю вас рассмотреть систему авторизации, такую ​​как CanCan или декларативная авторизация.Оба содержат простые способы решения проблем, с которыми вы сталкиваетесь здесь.Есть курс обучения или курс, но время будет потрачено не зря.

...