: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_manyは、組織内での存在People
を表すため、問題はより複雑になります。User
aUser
は複数の組織のメンバーである可能性がありますが、ログインする方法は1つだけです...
has_many ofは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
整数が小さいほど、階層(したがって特権)が大きくなります。個人のいずれかRoles
がのランク以下のランクを持っている:role_readable
場合Page
、ユーザーはページを表示する特権を持っています。
例えば。ロールを持つaは、またはのすべてのページを表示できますが、Person
。は表示できません。そのような読み取り可能なページをすべてリストするスコープが必要です。Manager
:role_readable
Manager
Worker
Boss
Roles
ランクの昇順で返されることを保証するdefault_scopeがあるためrole.first
、aのPerson
場合、最大の階層(つまり、最低のランク値)を持つロールが返されます。
私はRails3.2とPostgres9.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句」をどうすればよいかわかりません