ruby 在 1.9.x
版本开始支持使用json方式
创建哈希(Hash),示例代码如下:
1 | # 1 |
#1 和 #2 中 user 的 Key(name 和 age)都默认是 Symbol
类型,而 #3 的 user 已经指定了 Key 类型是 Symbol
。
而在 ruby 1.9.x
之前的版本不可以使用冒号:
即类似#2方式语法创建,只能像下面这样创建 Hash:
1 | user1 = {"name" => 'Jhon', "age" => 21} |
可以看出 Symbol
一直都存在,并且在新版本得到了“重用”。
当然了,最新的 ruby 版本也支持 1.9.x
之前 Hash 创建方式:
1 | user4 = {"name" => 'Jhon', "age" => 21} |
这个创建 Hash 的方法,Key 是 String
类型而不是 Symbol
类型。
我现在用的是 ruby 2.7.x
版本。
1 | # frozen_string_literal: true |
运行得到结果
user1 key 类型:Symbol
user1 key 类型:Symbol
——————–天生我材必有用——————–
user2 key 类型:Symbol
user2 key 类型:Symbol
——————-不以物喜不以己悲——————-
user3 key 类型:Symbol
user3 key 类型:Symbol
——————–桃花依旧笑春风——————–
user4 key 类型:String
user4 key 类型:String
看到这里,你可能会很疑惑:写这么多,你到底是遇到了什么问题?!
我们先做好情绪管理,书归正传。
情景是这样的,我要从数据库(MySQL)user 表中读取数据,将读取的数据实例化为 ruby 的 User 类。这里我没有采用任何 ORM 工具,纯手工打造。
ruby user.rb
代码片段
1 | class User |
User 类的属性和数据库表 user 的字段保持一致。
db.ruby
代码片段
1 | # frozen_string_literal: true |
结果有点出乎意料,实例化的 user 各个属性居然为空。百思不得骑jie……
开始调试,我用的是 RubyMine 进行开发的,会让你安装 ruby-debug-ide
、debase
,直接安装就可以了。
真相就要大白了,我加个打印,各位看官就明白了。
1 | user_record = result.first |
打印结果清一色是 String
,而在 User 构造方法中的 Key 都是 Symbol
类型,明显类型不一致,所以实例化失败,导致 user 各个属性字段就为空了🤕。
解决方法很简单,从 MySQL 查询出来的 Hash 数据的 Key 类型(String)转换为 Symbol
即可,有两个常用的方法可以进行转换:
1 | # 方法一:批量转换 |
至此,问题解决。
附上来自 AI 的解答:
使用 mysql2
查询 MySQL 数据库时,默认得到的哈希键是字符串类型,这是出于对不同数据库类型和查询结果灵活性的考虑。如果需要,您可以在处理查询结果时将这些字符串键转换为你需要的类型。
Ruby 是一门简单上手的编程语言,小巧可爱,有需要就去看看吧。顺便推一下自己的 Ruby on Rails 笔记:点此处直接飞往✈️。