在项目创建时为了逻辑上的简单,采用了多级子表嵌套;而且底层子表大多是静态表,即没有用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") endend
但是数组有个问题,就是无法分页,will_paginate自从3.0版本后默认只能在ActiveRecord::Relation上分页.但是你可以手动开启在数组上的分页功能.
在项目config/initializers路径下新建一个rb文件,比如paginate_on_array.rb,内容如下:
require 'will_paginate/array'
再重试以下发现还是出错,原来需要重启rails服务器,重启之后搜索功能就完成了 ;)
总结以上是内存溢出为你收集整理的Rails中多重子表多条件查询全部内容,希望文章能够帮你解决Rails中多重子表多条件查询所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)