【问题标题】:Searching item in a serialized data field在序列化数据字段中搜索项目
【发布时间】:2016-10-17 10:16:30
【问题描述】:

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

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

但它不能正常工作

【问题讨论】:

    标签: ruby-on-rails ruby serialization


    【解决方案1】:

    遗憾的是,您无法查询序列化字段,这是该功能的缺点。如果您不关心减慢您的 rails 应用程序(减慢它很多,特别是如果表包含许多行),您可以按照您的正确想象在 rails 上进行搜索。

    请记住,FatMaster.all 会将表中的每一行都加载到内存中,因此非常耗费资源。

    我不确定您的代码为什么不起作用,可能没有将所有结果字段设置为“正常”的行

    【讨论】:

    • 我有 2-3 行这样的行
    • @user3779329 您的查询缺少 2 个键的 ['result'] 检查我的答案。
    • 哦!谢谢我明白了!
    【解决方案2】:

    您缺少某些键的 ['result']。 您的查询:

    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' 将比较 hash 和 'Normal' 。因此,您没有得到任何结果。

    您必须从所有这些中获得“结果”。使用:

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

    【讨论】:

      【解决方案3】:

      另一种方法是:

      FatMaster.all.select do |fat_master| 
        fat_master.data.values.map {|v| v['result'] }.count('Normal') == 3
      end
      

      步骤:

      1. 映射哈希值会给我们:

        [“正常”、“高”、“正常”]

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

        假

      【讨论】:

        猜你喜欢
        • 2014-08-21
        • 2020-03-13
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2012-05-17
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多