我在我的Rails 6.1.1应用程序中的Tweet模型上有一个名为'payloads'的jsonb
类型列。我使用store直接访问此属性上的各个字段:
class Tweet < ApplicationRecord
store :payload, accessors: [:lang, :text, :entities], coder: JSON
end
注意,部分代码coder: JSON
是必要的,用以将序列化方式从默认的YAML更改为JSON——否则,在jsonb
列中你将得到YAML格式。
当我创建新推文时,我发现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在读取操作上能够正确地反序列化该字段,似乎是个奇迹。)另一位SO用户在这里阐述了这个问题:https://dbfiddle.uk/gcwTQOUm。