【发布时间】:2014-02-19 05:30:42
【问题描述】:
我有一个 Rails 模型,它有一个字段 array_field,它是一个序列化的文本数组。我希望这个数组值和another_field 的值的组合是唯一的。
应该直截了当,不是吗?
class Foo < ActiveRecord::Base
validates_uniqueness_of :array_field, scope: [:another_field]
serialize :filters, Array
end
这不起作用。但是,如果我在验证中切换它们,
validates_uniqueness_of :another_field, scope: [:array_field] 按预期工作。
有人可以解释为什么会这样吗?这是预期的行为吗?
当array_field 的值为nil 或[] 时,前一种设置的Postgres 错误是这样的:
PG::SyntaxError: ERROR: syntax error at or near ")"
LINE 1: ...other_field" = 103 AND "foo"."array_field" = ) LIMIT 1
当array_field 是[[1, 2], [3, 4, 5]](我使用的一个示例多数组)时,它是:
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
Rails 似乎不知道如何翻译这个查询的序列化对象。我错过了什么还是这是一个错误?
编辑:这发生在 Rails 4.0.2 中。
第二次编辑:
澄清:我理解为什么会发生这种情况(Rails 具有用于列表查询的自定义逻辑),并且我使用自定义验证器在验证之前手动执行序列化和自定义序列化器以避免 Yaml 字符串比较出现问题(如我的另一个问题here 中所述)。
在这一点上,我主要是想知道为什么 validates_uniqueness_of 将主要字段与 scope 字段区别对待,并希望有人能解释一下。
【问题讨论】:
-
你能指定rails版本吗?