我有带有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
。字段列表:
以下是所有数据的请求:
我想获取所有英文名称("en"
列中i18n_name
键的值)。
这是一个请求:
SELECT
id,
i18n_name,
i18n_name->'en' AS en
FROM property_keys;
它什么也不返回。
但是从理论上讲,应该返回填充有“ en”列的数据。
这是屏幕截图:
我也尝试使用->>
进行查询,但该查询不起作用:
我应该如何更改请求以及应该使用哪个PostgreSQL operators使其生效?
检查JSONB列的长度:
答案 0 :(得分:3)
->
和->>
运算符按预期方式通过键检索json对象,或者在后一种情况下作为文本。
我怀疑您拥有的真正问题是,您看到的数据并不是表中存储的真正内容,这就是为什么i18_name->'en'
不能工作的原因,因为没有键{{1} }。
为了能够确认我的写作,请在查询下面运行,以查看字符串中所存储的内容和表中存储的内容的长度是否匹配。他们可能不会:
en
您可以用它做什么?您可以使用select
length(i18n_name::text) AS stored,
length('{"en":"asdasdadad","de":"asdasdadad","ru":"asdasdadad"}') AS whatisee
数据类型转换来研究数据,也可以简单地bytea
对该列中包含正确(所见)数据的行进行调查。
由于jsonb字段中将有UPDATE
键,因此这将使运算符带给您真正的期望。
答案 1 :(得分:0)
您需要the ->>
operator:
SELECT id,
i18n_name,
i18n_name->>'en' AS en
FROM property_keys;