发现 jsonb 列数据有问题
Rails 4.2 和 ruby 2.10,我们能够获取名为数据的 jsonb 列,但在最新的 Rails 6.0.4.1 和 ruby-3.0.2 中,它返回空哈希,尽管列中有数据
任何机构都可以帮助我了解导致问题的原因吗
导轨 c
加载开发环境(Rails 4.2.7.1)
2.2.10 :001 > pp TestTable.find(1234)
<TestTable:0x007faba8255188
id:1234,
name: nil,
script_id:123,
is_active: true,
is_default: false,
created_at: Wed, 25 Aug 2021 03:40:33 UTC +00:00,
updated_at: Wed, 25 Aug 2021 03:40:33 UTC +00:00,
contacts_list: "user1",
se_results: {},
data:
{"OS"=>"",
"AUTHOR"=>"user1",
"VERSION"=> "10.3"
},
debug_owner: "",
transition: {},
status: nil>
$ rvm 列表
=* ruby-2.2.10 [x86_64]
ruby-2.3.0 [x86_64]
ruby-3.0.0 [x86_64]
ruby-3.0.2 [x86_64]
=> - current
=* - current && default
* - default
$
$ rvm 使用 ruby-3.0.2
使用 /Users/user2/.rvm/gems/ruby-3.0.2
$导轨c
解决依赖关系...加载开发环境(Rails 6.0.4.1)
3.0.2:001 > pp TestTable.find(329470)
#<TestTable:0x00007fa273e8cc28
id: 1234,
name: nil,
script_id:123,
is_active: true,
is_default: false,
created_at: Wed, 25 Aug 2021 03:40:33 UTC +00:00,
updated_at: Wed, 25 Aug 2021 03:40:33 UTC +00:00,
contacts_list: "user1",
se_results: nil,
data: {},
debug_owner: "",
transition: nil,
status: nil>
=>
迁移文件
最初创建的表没有 jsonb 数据列
class CreateTestTable < ActiveRecord::Migration
def change
create_table :test_table do |t|
t.string :name
t.belongs_to :script, foreign_key: true
t.boolean :is_active
t.boolean :is_default
t.string :contacts_list
t.string :se_results
t.string :debug_owner
t.string :status
t.timestamps null: false
end
end
end
后来,我们使用下面的迁移添加了 jsonb 列
class ColumnDataJsonb < ActiveRecord::Migration
def change
add_column :test_table, :data , :jsonb
change_column_default :test_table, :data , '{}'
end
end
如果我切换回 rails 4.2 并检查,我可以看到并能够获取数据
型号:test_table.rb
class TestTable < ActiveRecord::Base
DATA_ATTRIBUTES = [ :author, :version ]
store :data, accessors: DATA_ATTRIBUTES, coder: ActiveSupportJsonProxy
end
active_support_json_proxy.rb
class ActiveSupportJsonProxy
def self.dump(obj)
ActiveSupport::JSON.encode(obj) unless obj.nil?
end
def self.load(obj)
if obj.class == String
ActiveSupport::JSON.decode(obj) if obj.present?
else
obj
end
end
end