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

这实际上不是一个范围。

我会做两件事

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 回答