1

发现 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:

  {​​​​​​​​​​&quot;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
4

0 回答 0