Rails 中使用 Arel 实现外连接查询

例如有以下几个表

users: id
groups: id
resources: id, user_id(创建资源的用户), group_id(资源组)
users_resoures: user_id, resource_id (按用户授权资源)
users_groups: user_id, group_id (按组授权资源)

需求:

  1. 用户可以访问自己创建的资源
  2. 用户可以访问所属分组的资源
  3. 用户可以访问单独授权的资源

用 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

你可能感兴趣的:(Rails 中使用 Arel 实现外连接查询)