首页 文章

Rails通过序列化数组查找

提问于
浏览
2

我正在尝试基于序列化数组文本字段执行Rails查找(Postgres,如果重要的话) . 所以:

class Foo < ActiveRecord::Base
  serialize :arr, Array
end

然后:

> f = Foo.create!(arr: [[1, 2], [3, 4]])
=> #<Foo id: 1, arr: [[1, 2], [3, 4]]>
> f.arr
=> [[1, 2], [3, 4]]

一切都很好 . 但我似乎无法根据该字段进行查找:

> Foo.where(arr: [[1, 2], [3, 4]])
=> ActiveRecord::StatementInvalid Exception: PG::UndefinedFunction: ERROR:  operator does not exist: text = integer
   "foos"."arr" IN (1, 2, ...
                ^
   HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

似乎Rails正试图将其转换为IN查询 . 无论如何,我们知道Rails与Yaml序列化(或者我们呢?) . 所以让我们试试:

> Foo.where(arr: [[1, 2], [3, 4]].to_yaml)
=> #<ActiveRecord::Relation []>

更仔细的检查似乎引导我走向换行,因为这种查找失败的原因 . 我可以通过一个复杂的LIKE条款找到解决方法,但在那一点上,我想我可能走错了路 .

是否有基于序列化属性在Rails中查找模型的标准方法? (我应该用不是Yaml的东西序列化吗?)非常感谢!

1 回答

  • 0

    我现在使用的解决方案(肯定对其他方法开放!)是强制Rails使用Yaml之外的其他东西进行序列化,以允许字符串查询:

    class Foo < ActiveRecord::Base
      serialize :arr, SerializedArray
    
      def self.find_by_arr
        self.where(arr: SerializedArray.dump(arr)).take
      end
    end
    
    class SerializedArray
      def self.load(arr)
        arr ? JSON.load(arr) : nil
      end
    
      def self.dump(arr)
        arr ? JSON.dump(arr) : nil
      end
    end
    

    它有点janky,我必须使用自定义 find_by_arr 查询,但它的工作原理 .

    (编辑:删除了错误的示例代码 . )

相关问题