例如有以下几个表
users: id
groups: id
resources: id, user_id(创建资源的用户), group_id(资源组)
users_resoures: user_id, resource_id (按用户授权资源)
users_groups: user_id, group_id (按组授权资源)
需求:
- 用户可以访问自己创建的资源
- 用户可以访问所属分组的资源
- 用户可以访问单独授权的资源
用 arel 来实现
class Resource < ActiveRecord::Base
def self.accessible_by(user)
users_resources = Arel::Table.new(:users_resources)
resources = arel_table
left_outer = resources.join(users_resources, Arel::Nodes::OuterJoin).on(
users_resources[:resource_id].eq(resources[:id])
).join_sources
filters = resources[:user_id].eq(user.id)
.or(resources[:group_id].in(user.group_ids))
.or(users_resources[:user_id].eq(user.id))
joins(left_outer).where(filters)
end
end