1

我正在尝试: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_readablea 的,Page则用户有权查看该页面。

例如。带有角色的Persona可以查看带有 a或的Manager所有页面,但不能查看。我需要一个列出所有此类可读页面的范围。:role_readableManagerWorkerBoss

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 子句”

4

1 回答 1

2

经过大量实验,答案很简单:

scope :readable, lambda { |current_person| joins(:role_readable)
      .where(["roles.rank >= ?", current_person.roles.first.rank]) }

虽然join指的是关联名称:role_readable,但where必须使用表名——即。roles.rank不是role_readable.rank

新玩家的陷阱?显然。

感谢ctcherry和他在这里的回答,这让游戏失去了意义。

于 2013-03-18T13:15:34.173 回答