假设我已经在我的模型中序列化了一个列,如下所示,
class FatMaster < ActiveRecord::Base
serialize :data
end
当我做FatMaster.last.data时,我得到以下结果
{"Saturated Fat Sensitivity"=>{"result"=>"Normal", "value"=>"10"}, "Polyunsaturated Fat Sensitivity"=>{"result"=>"High", "value"=>"10"}, "Monounsaturated Fat Sensitivity"=>{"result"=>"Normal", "value"=>"10"}}
假设我想获得“饱和脂肪敏感度”,“多不饱和脂肪敏感度”和“单不饱和脂肪敏感度”的结果分别为“正常”,“正常”,“正常”的记录。
我试过这个:
FatMaster.all.select { |m| m.data["Saturated Fat Sensitivity"]["result"] == 'Normal' and m.data["Monounsaturated Fat Sensitivity"] == 'Normal' and m.data["Polyunsaturated Fat Sensitivity"] == 'Normal'}
但它无法正常工作
答案 0 :(得分:0)
某些键缺少[&#39;结果&#39;]。 您的查询:
FatMaster.all.select { |m| m.data["Saturated Fat Sensitivity"]["result"] == 'Normal'
and m.data["Monounsaturated Fat Sensitivity"] == 'Normal'
and m.data["Polyunsaturated Fat Sensitivity"] == 'Normal'}
因此,m.data["Monounsaturated Fat Sensitivity"] == 'Normal'
会比较哈希和&#39;正常&#39; 。因此,你没有得到任何结果。
你必须得到结果&#39;来自所有人。使用:
FatMaster.all.select { |m| m.data["Saturated Fat Sensitivity"]["result"] == 'Normal' and m.data["Monounsaturated Fat Sensitivity"]["result"] == 'Normal' and m.data["Polyunsaturated Fat Sensitivity"]["result"] == 'Normal'}
答案 1 :(得分:0)
遗憾的是,您无法查询序列化字段,这是该功能的缺点。如果您不关心减慢rails应用程序的速度(慢慢减慢,,特别是如果表包含很多行),您可以按照正确的想象在rails上进行搜索。
请记住,FatMaster.all会在内存中加载表中的每一行,因此它非常耗费资源。
我不确定为什么你的代码不起作用,可能没有行将所有结果字段设置为“正常”
答案 2 :(得分:0)
另一种方法是:
FatMaster.all.select do |fat_master|
fat_master.data.values.map {|v| v['result'] }.count('Normal') == 3
end
映射哈希值将为我们提供:
[&#34;正常&#34;,&#34;高&#34;,&#34;正常&#34;]
计数只会看到我们是否有3个法线,在我们的例子中没有,所以会得到我们:
假