【发布时间】:2014-03-19 07:36:06
【问题描述】:
我正在尝试基于序列化数组文本字段(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 的东西进行序列化吗?)非常感谢!
【问题讨论】:
-
呃。为什么不使用 PostgreSQL 的原生数组支持?然后你也可以使用它对数组索引的支持。
-
因为我需要存储尺寸不断变化的非正方形大小的多维数组。我的理解是 Postgres 不支持这一点,但如果支持,一定要告诉我。无论哪种方式,我都不确定 Rails 在这种情况下是否会正常运行。
-
确认这不是一个选项:
PG::InvalidTextRepresentation: ERROR: multidimensional arrays must have array expressions with matching dimensions -
这是一个很好的理由!我已经习惯了人们只是不考虑数据库的功能......
标签: ruby-on-rails postgresql serialization