例如有以下幾個(gè)表
users: id
groups: id
resources: id, user_id(創(chuàng)建資源的用戶), group_id(資源組)
users_resoures: user_id, resource_id (按用戶授權(quán)資源)
users_groups: user_id, group_id (按組授權(quán)資源)
需求:
- 用戶可以訪問自己創(chuàng)建的資源
- 用戶可以訪問所屬分組的資源
- 用戶可以訪問單獨(dú)授權(quán)的資源
用 arel 來實(shí)現(xiàn)
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