美文网首页
Rails 中使用 Arel 实现外连接查询

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

作者: john1king | 来源:发表于2017-04-25 18:00 被阅读0次

例如有以下几个表

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 实现外连接查询

    例如有以下几个表 需求: 用户可以访问自己创建的资源 用户可以访问所属分组的资源 用户可以访问单独授权的资源 用 ...

  • 连接查询;外键

    连接查询 连接查询(join)分类:内连接、外连接、自然连接、交叉连接 使用方式:左表 join 右表 交叉连接(...

  • 连接查询;外键

    连接查询 连接查询(join)分类:内连接、外连接、自然连接、交叉连接 使用方式:左表 join 右表 交叉连接(...

  • 51cto赵强HADOOP学习(十六)hive的数据查询

    简单查询 查询的语法 过滤和排序 在查询中使用过滤 在查询中使用排序 Hive的表连接 等值连接 不等值连接 外连...

  • MySQL连接查询:左外连接、右外连接、全连接

    昨天介绍了MySQL连接查询中的交叉连接和内连接,今天继续介绍连接查询中的剩下三个连接方法,左外连接、右外连接、全...

  • python学习笔记-数据库06_连接查询

    连接查询可以实现多表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成连接查询可以分为:内连接查询左连接...

  • 数据库-联表查询

    SQL使用(一)——联合查询 1.联合查询分类 内连接(inner Join 或 Join) 外连接(outer ...

  • MySQL子查询

    为什么要使用子查询 在MySQL软件中虽然可以通过连接査询实现多表查询数据记录,但是却不建议使用。这是因为连接査询...

  • SQL联合查询

    SQL使用——联合查询 1.联合查询分类 内连接(inner Join 或 Join) 外连接(outer Joi...

  • MYSQL多表查询

    多表查询就是从多张表中查找所需数据,并且整合在一起显示出来的意思 多表查询拥有多种实现方式:内连接、外连接、子查询...

网友评论

      本文标题:Rails 中使用 Arel 实现外连接查询

      本文链接:https://www.haomeiwen.com/subject/zvavzttx.html