У меня есть модель 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]
работает должным образом.
Может кто-нибудь объяснить, почему это так? Это ожидаемое поведение?
Ошибка Postgres для прежней установки, когда значение array_field
«s является nil
или []
это:
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]]
(образец multiarray я использовал), это:
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 имеет собственную логику для списка запросов), и я использую как пользовательский валидатор, чтобы вручную выполнить сериализацию, прежде чем проверка и обычай сериализатор, чтобы избежать проблем со сравнением строк Ямла (как подробно описано в моем другом вопросе here).
На данный момент я в основном просто удивляюсь, почему validates_uniqueness_of
обрабатывает основное поле, отличное от полей scope
, и я надеюсь, что кто-то может пролить некоторый свет.
Вы можете указать рельсы версии? –
Rails 4.0.2, извините. – JacobEvelyn