搜索序列化数据字段中的项目

时间:2016-10-17 10:16:31

标签: ruby-on-rails ruby serialization

假设我已经在我的模型中序列化了一个列,如下所示,

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'}

但它无法正常工作

3 个答案:

答案 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

步骤:

  1. 映射哈希值将为我们提供:

    [&#34;正常&#34;,&#34;高&#34;,&#34;正常&#34;]

  2. 计数只会看到我们是否有3个法线,在我们的例子中没有,所以会得到我们:

相关问题