Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 序列化文本数组的Rails验证范围_Ruby On Rails_Postgresql - Fatal编程技术网

Ruby on rails 序列化文本数组的Rails验证范围

Ruby on rails 序列化文本数组的Rails验证范围,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我有一个Rails模型,它有一个字段array\u field,这是一个序列化文本数组。我希望此数组值和另一个\u字段的值的组合是唯一的 应该直截了当,不是吗 class Foo < ActiveRecord::Base validates_uniqueness_of :array_field, scope: [:another_field] serialize :filters, Array end 当array\u字段为[[1,2],[3,4,5](我使用的示例多数组)时,

我有一个Rails模型,它有一个字段
array\u field
,这是一个序列化文本数组。我希望此数组值和另一个\u字段的值的组合是唯一的

应该直截了当,不是吗

class Foo < ActiveRecord::Base
  validates_uniqueness_of :array_field, scope: [:another_field]

  serialize :filters, Array
end
array\u字段
[[1,2],[3,4,5]
(我使用的示例多数组)时,它是:

Rails似乎不知道如何转换此查询的序列化对象。我是遗漏了什么还是这是一个错误

编辑:这发生在Rails 4.0.2中

第二次编辑:

澄清:我理解为什么会发生这种情况(Rails具有用于列表查询的自定义逻辑),我使用自定义验证器在验证之前手动执行序列化,并使用自定义序列化器避免比较Yaml字符串时出现问题(如我的另一个问题中所述)


在这一点上,我只是想知道为什么
验证的唯一性将主字段与
范围
字段区别对待,并希望有人能提供一些信息。

我无法解释为什么验证是一种方式,而不是另一种方式

但我认为基本上您的问题是由于
serialize
只定义属性在保存时使用Yaml序列化,在加载时反序列化

换句话说:通过执行
serialize:filters,Array
所说的唯一一件事就是

保存一个Foo时,首先使用Yaml序列化它的filters属性, 从DB加载Foo时,请确保 filters属性是反序列化后的数组,否则引发异常

它不影响查询的构造方式。取而代之的是,使用Rails通常的查询规则。因此,数组被转换为逗号分隔的数字列表。例如,当构造类似
的查询时,这是有意义的。这就是查询失败的原因。DB字段是一个字符串,但您试图将其与列表进行比较


我还没有在Rails 4中使用本机PostgreSQL数组列,但我猜如果您使用这些列而不是序列化类型的解决方案,这些问题将得到解决。您还可以在数据库级别的数组内容中进行搜索。您可以指定rails版本吗?没有选项:
PG::InvalidTextRepresentation:ERROR:多维数组必须具有匹配维度的数组表达式。
请解释您的意思。收到此错误消息时,您到底做了什么?很抱歉,不清楚。我不能使用原生Postgres数组,因为Postgres要求它的多维数组是“矩形”的,而我的多维数组不是(请参阅我原始问题中的示例数组)。
PG::SyntaxError: ERROR:  syntax error at or near ")"
   LINE 1: ...other_field" = 103 AND "foo"."array_field" = ) LIMIT 1
PG::UndefinedFunction: ERROR:  operator does not exist: text = integer
   LINE 1: ...other_field" = 103 AND "foo"."array_field" = 1, 2, 3, 4, 5) LIMIT 1