我在PostgreSQL 9.5中有一个表,其中jsonb列名为segmented_data,我在此字段中有一些数据记录
>>> b'\\x7c12\\x7c5\\x7c\\x0a'.decode('unicode_escape')
'|12|5|\n'
>>> '\\x7c12\\x7c5\\x7c\\x0a'.encode('latin1').decode('unicode_escape')
'|12|5|\n'
如何通过segmented_data的keyw之一找到数据库中的这条记录? 我试过了:
ProjectKeyword.first
=> #<ProjectKeyword:0x007fa83a17e7f8 id: 2201, project_id: 79, keyword_id: 2201, segmented_data: {"keyword_value"=>"land for sale", "dimension_value"=>{"Property type"=>"Land"}}>
我在这些查询中做错了什么?
EDITED
我的模特
ProjectKeyword.where("segmented_data ->> 'keyword_value' = 'land for sale'").first
=> nil
ProjectKeyword.where('segmented_data @> ?', {keyword_value: 'land for sale'}.to_json).first
=> nil
ProjectKeyword.where('segmented_data @> ? ', '{"keyword_value":"land for sale"}' ).first
=> nil
移植
class ProjectKeyword < ApplicationRecord
serialize :segmented_data, JSON
belongs_to :project
belongs_to :keyword
has_many :project_keyword_dimensions
has_many :dimensions, through: :project_keyword_dimensions
validates :project_id, :keyword_id, presence: true
end
EDITED
我想我找到了这个问题的可能原因 我的db模式仍然不是sql格式,我添加了这一行
class AddSegemtnedDataToProjectKeywords < ActiveRecord::Migration[5.0]
def change
add_column :project_keywords, :segmented_data, :jsonb, default: '{}'
add_index :project_keywords, :segmented_data, using: :gin
end
end
进入application.rb文件
但现在如果我正在运行命令
config.active_record.schema_format = :sql
我收到此错误
bundle exec rake db:migrate --trace
它出了什么问题?怎么解决?
答案 0 :(得分:0)
解决此问题的方法是删除此行
serialize :segmented_data, JSON
来自模型ProjectKeyword
删除此行后,所有查询都开始工作,现在问题只是: segmented_data
的默认值不再是哈希值,它变成了字符串'{}'
因此,在更新此字段中的数据之前,我必须将哈希值分配给此字段
project_keyword.segmented_data = {}
project_keyword.save!