【发布时间】:2019-01-23 23:13:21
【问题描述】:
我有带有 Rails 5 应用程序的 PostgreSQL 10.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。字段列表:
- id:大整数
- i18n_name: jsonb
这是对所有数据的请求:
我想获取所有英文名称("en" 键在 i18n_name 列中的值)。
这是一个请求:
SELECT
id,
i18n_name,
i18n_name->'en' AS en
FROM property_keys;
它什么也不返回。
但理论上应该返回填充“en”列的数据。
这是截图:
我还尝试使用->> 进行查询,但没有成功:
我应该如何更改我的请求以及我应该使用哪个PostgreSQL operators 来使其正常工作?
检查的 JSONB 列的长度:
【问题讨论】:
-
尝试使用
->>运算符? -
从简化的自治示例开始,例如
with t(x) as (values('{"en":"a","de":"b","ru":"c"}'::jsonb)) select x, x->'en' from t;如果它对你有用(它应该)然后尝试找出差异。 -
@Abelisto 查询
with t(x) as (values('{"en":"a","de":"b","ru":"c"}'::jsonb)) select x, x->'en' from t;有效! -
好的,有调试模板:dbfiddle.uk/… 只需使用您的表/列名而不是 CTE。请注意,JSONB 对象中的“bе”键包含西里尔字母“е”,因此其十六进制表示不同。
-
@bmalets 告诉你有些字符是你看不到的。如果没有这样的密钥,您将无法提取
en密钥。你的答案就在那里。调查数据以查看其中的内容或通过运行更新来修复它
标签: json postgresql ruby-on-rails-5 jsonb postgresql-10