在项目创建时为了逻辑上的简单,采用了多级子表嵌套;而且底层子表大多是静态表,即没有用has_one或belongs_to作为相互关系的.

在某个对象的搜索涉及到3个底层子表中的字段的比较,很难用where或find_by_sql方法,遂先用纯SQL语句写了个查询:

select r.*,tmp1.value from (select re.risk_id,tmp0.value from (select rl.risk_evaluate_id,rln.value from risk_levels rl inner join risk_level_names rln on rln.id = rl.risk_level_name_id) as tmp0 inner join risk_evaluates re on tmp0.risk_evaluate_id = re.id) as tmp1 inner join risks r on tmp1.risk_id = r.id

注意,这还只是查询的一部分,完整查询界面如下动画所示:

共有7个查询项,最深子表深度为3层,用pgAdmin查询结果如下:

我们可以直接在rails console中做测试:

ActiveRecord::Base.connection.execute("select r.id,tmp.degree from (SELECT re.risk_id as risk_id,rl.degree as degree FROM risk_evaluates re inner join risk_levels rl on rl.risk_evaluate_id = re.id) AS tmp inner join risks r on tmp.risk_id = r.id")

查询结果为hash数组,key为查询字段名.但是没法和其他条件混合起来使用,所以还是用map来做:

if @risks.count != 0 && risk_level_name_id != "-1"@risks = @risks.select do |risk|eval("risk.risk_evaluate.risk_level.risk_level_name.value " + risk_operator + "RiskLevelName.find(risk_level_name_id).value")end
end

但是数组有个问题,就是无法分页,will_paginate自从3.0版本后默认只能在ActiveRecord::Relation上分页.但是你可以手动开启在数组上的分页功能.

在项目config/initializers路径下新建一个rb文件,比如paginate_on_array.rb,内容如下:

require 'will_paginate/array'

再重试以下发现还是出错,原来需要重启rails服务器,重启之后搜索功能就完成了 ;)

Rails中多重子表多条件查询相关推荐

  1. SAP ABAP 动态内表的条件查询(SORT / READ TABLE / LOOP)

    SAP ABAP 动态内表的条件查询(SORT / READ TABLE / LOOP) 简介: 动态内表是动态报表的核心,动态内表的条件操作能有效解决性能问题.这篇文章用于普及动态内表在 SORT ...

  2. springDataJpa入门教程(5)-单表动态条件查询+分页

    springDataJpa入门教程 springDataJpa入门教程(1)-基于springBoot的基本增删改查 springDataJpa入门教程(2)-Specification动态条件查询+ ...

  3. jpa多表关联条件查询实现

    通过实体类映射实现多表关联条件查询 jpa对于多表关联可以在实体类中进行关联映射,一对一用@OneToOne,一对多用@OneToMany,多对多用@ManyToMany,多对一用@ManyToOne ...

  4. mongotemplate 多表多条件查询记录

    mongotemplate 多表多条件查询记录 在这里插入代码片

  5. 问:如何在SBO报表设计器中对LastName+FirstName进行条件查询

    问:如何在SBO报表设计器中对LastName+FirstName进行条件查询? 答: declare @strUsr varchar(100) select @strUsr=a.FirstName ...

  6. laravel5.4中orm中的wherein与多条件查询

    $array_1_11 = VenousThrombusAnswer:: where(['aa'=>'111','class'=>'M4']) ->whereIn('id',['47 ...

  7. 查询条件中含有加号_excel中最全的多条件查询方法都在这里了

    今天在制作一个简单的公司人事查询,总结了一下多条件查询,原来excel中竟然有这么多的方法,那么可能会有不少人会认为:我只要会一种最简单的方法不就行了,干嘛要费脑子学那么多?其实学会更多不就是为了掌握 ...

  8. mybatis 中 Example 的使用 :条件查询、排序、分页(三种分页方式 : RowBounds、PageHelpler 、limit )

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. import tk.mybatis.mapper.entity.Example;import com ...

  9. mysql 中间表的好处_Mysql中使用中间表提高统计查询速度

    对于数据量较大的表,在其上进行统计查询通常会效率很低,并且还要考虑统计查询是否会对在线的应用产生负面影响.通常在这种情况下,使用中间表可以提高统计查询的效率, 下面通过对session 表的统计来介绍 ...

最新文章

  1. 计算机中的大端模式与小端模式
  2. python multiprocessing manager list error: [Errno 2] No such file or directory
  3. Where do SAP CRM HANA Live Querys come from
  4. pyqt安装_Win10下安装LabelImg以及使用(绝对是全网最简单的教程)
  5. java代码获取gc信息,如何监视Java垃圾回收
  6. 在openGL中绘制图形
  7. 化合物修饰壳聚糖水凝胶:丙烯酸接枝/聚乙烯醇/温敏淫羊藿苷/醛-亚胺-壳聚糖水凝胶的制备
  8. 磁共振线圈分类_磁共振线圈的发展历程
  9. 扯淡扯着扯着就远了----关键字;宁静致远
  10. 苹果12系列不附赠耳机充电器引争议,你还会买吗?
  11. iOSapp的json告示
  12. Google Professional Data Engineer(PDE)考试
  13. 蓝桥杯单片机学习记录(8)(PWM脉宽调制)
  14. Android的鼠标事件流向
  15. 用C#制作PDF文件全攻略 .
  16. 利用小技巧用于跟踪函数的进出过程
  17. 文献管理软件 | endnote与zotero的对比
  18. PyTorch 图像识别实战
  19. redis“万金油”的String,为什么不好用了?
  20. 相似图片搜索的三种算法

热门文章

  1. 世界前 1000 顶级计算机科学家名单出炉;Java25岁生日官方启动最佳JDK功能票选活动...
  2. 微调电位器命名规则_vishay电阻命名规则知多少
  3. android百度地图画线,Android实现百度地图两点画弧线
  4. Python Web开发 之 学生管理系统(2)[实现筛选,搜索,分页]
  5. 地大网上报账之日常报销流程
  6. AI的入门圣经,PRML最全资源合集(含讲解以及中译版)
  7. 基于 Alexnet 的服装图像模式识别系统的设计与实现
  8. 深度学习——Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
  9. 如何将footer标签固定在底部_div footer标签css实现位于页面底部固定
  10. 广东计算机类专科院校排名,广东省高职院校全国排名+各院校王牌专业