bma*_*ets 8 postgresql json jsonb ruby-on-rails-5 postgresql-10
我有 PostgreSQL 10.5 数据库和 Rails 5 应用程序。
我的型号:
# == Schema Information
#
# Table name: property_keys
#
#  id         :integer          not null, primary key
#  name       :string
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  i18n_name  :jsonb
#
class PropertyKey < ApplicationRecord
  # Fields
  store :i18n_name, accessors: I18n.available_locales, coder: JSON
end
我的迁移:
class LocalizeProperties < ActiveRecord::Migration[5.2]
  def up
    add_column :property_keys, :i18n_name, :jsonb
    PropertyKey.all.each do |property_key|
      [:en, :de, :ru].each do |locale_key|
        property_key.i18n_name[locale_key] = property_key.name
      end
      property_key.save!
    end
  end
  def down
    remove_column :property_keys, :i18n_name
  end
end
表名:property_keys. 字段列表:
这是对所有数据的请求:
我想获取所有英文名称(列"en"内键的值i18n_name)。
这是一个请求:
SELECT
    id,
    i18n_name,
    i18n_name->'en' AS en
FROM property_keys;
它什么也没有返回。
但理论上应该返回填充“en”列的数据。
这是一个屏幕截图:
我也尝试过查询,->>但它不起作用:
我应该如何更改我的请求以及应该使用哪些PostgreSQL 运算符才能使其正常工作?
检查 JSONB 列的长度:
->和->>运算符按预期工作,通过键检索 json 对象,或者在后一种情况下作为文本检索。
我怀疑您遇到的真正问题是您看到的数据并不是真正存储在表中的数据,这就是为什么i18_name->'en'由于没有 key 而无法工作的原因en。
为了能够确认我的写作,请运行下面的查询,看看您在字符串中看到的长度与表中存储的长度是否匹配。他们可能不会:
select
  length(i18n_name::text) AS stored,
  length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee
你能用它做什么?bytea使用数据类型转换来调查数据,或者仅UPDATE调查此列中具有正确(您所看到的)数据的行。
en这将使操作员带来您实际期望的东西,因为jsonb 字段中会有键。
| 归档时间: | 
 | 
| 查看次数: | 27340 次 | 
| 最近记录: |