【问题标题】:Creating a fake has_many relationship - one that depends on some other member var创建一个假的 has_many 关系——一个依赖于其他成员变量的关系
【发布时间】:2011-01-10 22:28:56
【问题描述】:

我的应用程序有一个用户模型,其中包含一些简单的访问级别检查。此访问级别决定了对数据库中其他模型的访问范围。准确地说,我有地区、学校、教师、房间和学生模型。管理员可以查看所有记录,学区可以查看所有儿童学校、教师、教室和学生,校长可以查看所有儿童教师、教室和学生,教师可以查看所有儿童教室和学生。

这是通过将用户对象与一个或多个级别的模型相关联来完成的。

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

这个 func 在代码中被视为一个普通的旧 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 集合对象?

如果您认为我是个脑残,并且我遗漏了一些非常明显的东西,请不要犹豫,不吝赐教!我原以为这个系统运行良好,直到我不得不使用 .find 管理员级别的用户帐户。它基本上是在运行

Teacher.all.find :conditions => 'xyz'

...遗憾的是,它返回了一个 Enumerator 对象,而不是 Teacher 模型的 ActiveRecord。

【问题讨论】:

    标签: ruby-on-rails activerecord has-many


    【解决方案1】:

    基本上,您有四个角色(管理员、区长、校长和教师 (?))。每个用户都有其中一个角色,并且您有一组规则来确定每个角色的访问权限。对吗?

    这个问题已经解决了。我会敦促您考虑使用 CanCan 或声明式授权等授权系统。两者都包含处理您在此处遇到的问题的直接方法。有一个学习曲线或课程,但时间会花得很好。

    【讨论】:

    • CanCan 看起来很棒,但不太适合我在这里所追求的。我以这种方式组织模型的原因是我必须这样做。学区、学校、教师、房间和学生的层次结构对于我需要处理数据至关重要,并且用户模型必须能够“附加”到任何级别(至少高于班级)编辑:之后-想:无论如何,我想知道是否可以伪造 ActiveRecord 集合。
    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 2014-09-04
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多