我的应用程序有一些简单的访问级别检查的用户模型。此访问级别确定对数据库中其他模型的访问范围。准确地说,我有地区,学校,教师,房间和学生模型。一个管理员可以看到所有的记录,一个小区可以看到所有的小孩学校,老师,房间和学生,一个校长可以看到所有小孩的老师,房间和学生,一个老师可以看到所有小孩的房间和学生。创建一个虚假的has_many关系 - 取决于其他成员var
这是通过将用户对象与一个或多个级别的模型关联来完成的。
belongs_to :district
belongs_to :school
belongs_to :teacher
因此,学校校长将有一个地区ID和学校ID,但其教师ID将为空。
访问孩子们通过功能控制是这样的:
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时,我的假关联会失败,或者由has_many创建的ActiveRecord集合特定的某个函数。
所以,对我的问题。如何在不明确调用has_many函数的情况下返回ActiveRecord集合对象?
如果你认为我是一个流血的阻滞,我错过了一些显而易见的东西,请不要犹豫,给我启发!我曾认为这个系统很好,直到我不得不使用管理员级别的用户帐户。它本质上正在运行
Teacher.all.find :conditions => 'xyz'
...并且可悲地返回Enumerator对象而不是教师模型的ActiveRecord。
CanCan看起来不错,但它不太适合我在这里之后。我以这种方式组织模型的原因是因为我必须这样做。地区,学校,教师,房间和学生的层面对于我需要处理的数据至关重要,用户模型必须能够“附加”到任何级别(至少在课堂上) 编辑:后想:无论如何,我想知道是否有可能伪造ActiveRecord集合。 – harbogast 2011-01-11 00:46:07