1

:readableモデルにスコープを作成して、読み取りに十分な「ランク」を持つすべてのをPage返すようにしています。Pagescurrent_person

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

私はこれを含む多くのスコープ順列を試しましたが、成功しませんでした(上記のものは「シンボルを整数に変換できません」というエラーを出します)。

Users(認証などを処理する/アカウントと同義である)have_manyは、組織内での存在Peopleを表すため、問題はより複雑になります。UseraUserは複数の組織のメンバーである可能性がありますが、ログインする方法は1つだけです...

has_many ofはRolesUser'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_readableManagerWorkerBoss

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句」をどうすればよいかわかりません

4

1 に答える 1

2

そして、多くの実験の後、答えは非常に簡単です。

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

結合はアソシエーション名を参照しますが:role_readablewhereはテーブル名を使用する必要があります—つまり。roles.rankではありませんrole_readable.rank

新しいプレーヤーのための罠?どうやら。

ctcherryへの称賛とゲームを手放したここでの彼の答え。

于 2013-03-18T13:15:34.173 に答える