【发布时间】: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