我正在尝试查询jsonb列中的数据类型。当我使用标准SQL查询时,响应为空。我使用的是this as a reference.
我的数据:id: "f0242deb-fef5-4221-b4eb-68610d355a06", metadata: {"classification"=>"unclassified"}
我的控制器查询:Transaction.where('metadata @> ?', {classification: 'unclassified'}.to_json)
我将此作为响应Transaction Load (39.0ms) SELECT "transactions".* FROM "transactions" WHERE (metadata @> '{"classification":"unclassified"}') => []
我希望响应包含上述数据集,因为classification匹配。我哪里错了?
供参考的模式和模型。
schema.rb
create_table "transactions", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.jsonb "metadata", default: "{}", null: false
t.index ["metadata"], name: "index_transactions_on_metadata", using: :gin
endtransaction.rb
class Transaction < ApplicationRecord
require 'json'
include ActiveModel::Serialization
serialize :metadata
store_accessor :metadata, :classification, :amount, :merchant, :category
validates :transaction_date, :classification, :amount, :merchant, :category, presence: true
end发布于 2021-06-15 16:50:53
我认为问题出在json serialization上,它看起来会强制转换输入的json数据,看看(在我的项目上):
> Event.create(payload: {question: "jsonb index", answer: "json serialize"})
> ... ["payload", "\"---\\n:question: jsonb index\\n:answer: json serialize\\n\""]在数据库中,有效负载将保存为:"---\n:question: jsonb index\n:answer: json serialize\n",而jsonb查询无法找到它。
现在更改序列化程序
#require 'json'
#include ActiveModel::Serialization
serialize :payload, HashSerializer
store_accessor :payload, :question, :answer有效负载将被保存为{"answer": "serialize", "question": "jsonb index"}和jsonb查询可以找到它。
当然,如果我删除serialize,它也可以工作
请记住,数据库适配器会为您处理某些序列化任务。例如: PostgreSQL中的
json和jsonb类型将在JSON对象/数组语法和RubyHash或Array对象之间透明地转换。在这种情况下,不需要使用#serialize。
https://stackoverflow.com/questions/67977006
复制相似问题