我正在尝试:readable
在我的模型中创建一个范围Page
以返回所有Pages
具有current_person
足够“等级”来阅读的内容:
scope :readable, lambda { |current_person| joins(:role_readable)
.where(:role_readable[:rank].gte(current_person.roles.first.rank) ) }
我尝试了许多范围排列,包括这个,但没有成功(上面的一个给出“无法将符号转换为整数”错误)。
问题变得更加复杂,因为Users
(处理身份验证等/与帐户同义) have_manyPeople
代表User
' 在组织中的存在 - 即。aUser
可以是多个组织的成员,但只需要一种登录方式...
has_many的Roles
那个User's
People
,给出范围用来返回:readable
页面的排名。(即Users
处理身份验证,而People
处理授权(除其他外),因为User
可能是多个组织的成员,用户对其具有不同Roles
的 ,因此具有不同的层次结构和特权。)
class User < ActiveRecord::Base
has_many :people
has_many :roles, through: :people
class Person < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :roles
class Role < ActiveRecord::Base
# name :string(255)
# rank :integer
has_and_belongs_to_many :people
class Page < ActiveRecord::Base
belongs_to :role_readable, class_name: "Role", foreign_key: :role_read_id
belongs_to :role_editable, class_name: "Role", foreign_key: :role_write_id
角色有一个层次结构(例如老板、经理、工人……),记录为一个rank
(整数)——整数越小,层次结构越大(因此特权)。如果任何一个 Person 的Roles
排名小于或等于:role_readable
a 的,Page
则用户有权查看该页面。
例如。带有角色的Person
a可以查看带有 a或的Manager
所有页面,但不能查看。我需要一个列出所有此类可读页面的范围。:role_readable
Manager
Worker
Boss
Roles
有一个 default_scope 确保它们按等级升序返回,因此role.first
对于 aPerson
将返回具有最大层次结构(即最低等级值)的角色。
我正在使用 Rails 3.2 和 Postgres 9.2.2.0,所以我也对可用的许多查询/Arel 选项感到困惑。
提前致谢!
更新:
如果我尝试这个范围:
scope :readable, lambda { |current_person| where("role_readable.rank
=> ?",current_person.roles.first.rank) }
我收到此错误:
PGError: ERROR: missing FROM-clause entry for table "role_readable"
LINE 1: ...*) FROM "pages" WHERE "pages"."team_id" = 2 AND (role_reada...
^
: SELECT COUNT(*) FROM "pages" WHERE "pages"."team_id" = 2 AND (role_readable.rank => 1)
我不确定如何理解“缺少 FROM 子句”