Rails通过序列化数组进行查询[英] Rails look up by serialized array

本文是小编为大家收集整理的关于Rails通过序列化数组进行查询的处理方法,想解了Rails通过序列化数组进行查询的问题怎么解决?Rails通过序列化数组进行查询问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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 的东西进行序列化吗?)非常感谢!

推荐答案

我现在使用的解决方案(肯定对其他方法开放!)是强制 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

这有点麻烦,因为我必须使用自定义 find_by_arr 进行查询,但它可以工作.

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

本文地址:https://www.itbaoku.cn/post/1764097.html