0

次のことを考慮してください

class Room < ActiveRecord::Base
  belongs_to :user
  has_many :authorisations, dependent: :destroy
  has_many :authorised_users, through: :authorisations, source: :user

  scope :without_privacy_restriction, where(public: true)
end

class User < ActiveRecord::Base
  has_many :rooms, dependent: :destroy
  has_many :accessible_rooms, through: :authorisations, source: :room
  has_many :authorisations
end

ユーザーはルームの所有者になることができ、別のユーザーのルームで承認されたユーザーになることもできます。さらに、ユーザーは管理者 (これを表すユーザー テーブルの別の列) として定義でき、何があってもすべての部屋にアクセスできます。

アクセス可能なすべての部屋を特定のユーザーに返す効率的なスコープを記述できるようにしたいのですが、これを実現する最も効率的な方法を判断できません。

4

1 に答える 1

0

これは実際にはスコープではありません。

私は2つのものを作ります

class Room < ActiveRecord::Base

  class << self

    def accessible_by(user) # classmethods and scopes are interchangeable
      if user.admin?
        scoped # this returns "all" but not as an array, so you can chain
               # starting with rails4 you can use "all".
      else
        user.accessible_rooms
      end
    end

  end

end

これは、ユーザーが管理者であるかどうかにかかわらず、異なるスコープが返されるようにするためです。次に、同じスコープで所有者を取得するには、所有する部屋の承認を追加して「所有権」を非正規化できます

class Room < ActiveRecord::Base

  after_create :authorise_owner

  def authorise_owner
    authorisations.create(user_id: owner_id)
  end

end

したがって、奇妙な結合を行う必要はありません。

于 2012-10-11T12:19:27.443 に答える