ruby on rails查询jsonb字段不起作用

时间:2016-06-20 12:25:30

标签: sql ruby-on-rails postgresql rails-postgresql jsonb

我在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

它出了什么问题?怎么解决?

1 个答案:

答案 0 :(得分:0)

解决此问题的方法是删除此行

serialize :segmented_data, JSON

来自模型ProjectKeyword

删除此行后,所有查询都开始工作,现在问题只是: segmented_data的默认值不再是哈希值,它变成了字符串'{}'
因此,在更新此字段中的数据之前,我必须将哈希值分配给此字段

project_keyword.segmented_data = {}
project_keyword.save!