2011-01-10 42 views
1

我的应用程序有一些简单的访问级别检查的用户模型。此访问级别确定对数据库中其他模型的访问范围。准确地说,我有地区,学校,教师,房间和学生模型。一个管理员可以看到所有的记录,一个小区可以看到所有的小孩学校,老师,房间和学生,一个校长可以看到所有小孩的老师,房间和学生,一个老师可以看到所有小孩的房间和学生。创建一个虚假的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。

回答

0

基本上你有四个角色(管理员,地区负责人,校长和教师(?))。每个用户都有这些角色之一,并且您有一组规则来确定每个角色的访问权限。正确?

此问题已解决。我会敦促你考虑一个授权系统,如CanCan或声明授权。两者都包含直截了当的方式来处理你在这里挣扎的问题。有一条学习曲线,或者课程,但是时间会花费很多。

+0

CanCan看起来不错,但它不太适合我在这里之后。我以这种方式组织模型的原因是因为我必须这样做。地区,学校,教师,房间和学生的层面对于我需要处理的数据至关重要,用户模型必须能够“附加”到任何级别(至少在课堂上) 编辑:后想:无论如何,我想知道是否有可能伪造ActiveRecord集合。 – harbogast 2011-01-11 00:46:07

相关问题