在我的Rails6.1.1应用程序中,我的Tweet
型号有一个名为"PayLoads"的jsonb
类型的列.我使用store直接访问此属性上的各个字段:
class Tweet < ApplicationRecord
store :payload, accessors: [:lang, :text, :entities], coder: JSON
end
(请注意,第coder: JSON
部分是将序列化从YAML缺省值更改为JSON所必需的,否则您将在jsonb
列中使用YAML.)
当我创建一个新的tweet时,我发现ActiveRecord在插入期间错误地转义了JSON字符串:
Tweet.create payload: {foo: 'bar'}
TRANSACTION (0.7ms) BEGIN
Tweet Create (2.0ms) INSERT INTO "tweets" ("payload", ...) VALUES ($1, ...) RETURNING "id" [["payload", "\"{\\\"foo\\\":\\\"bar\\\"}\""], ...]
我指的是第"\"{\\\"foo\\\":\\\"bar\\\"}\""
部分.看起来像是被双重逃脱了.这导致了一种"字符串异常",其中字符串中的一个字符串存储在payloads
列中,使得postgres不能使用箭头->
语法对字段执行任何搜索.Postgres不能将该值识别为JSON.(然而,看起来不可思议的是,Rails能够在读取操作中正确地反序列化该字段.)
另一个用户has illustrated的问题在此:https://dbfiddle.uk/gcwTQOUm