我想将SQL查询结果转换为Ruby哈希,其中只显示两行,第一行作为键,第二行作为值。例如,如果我的查询得到了这个结果:
+----+--------+
| id | name |
+--- +--------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+----+--------+
我想操纵这些数据来获得像这样的Ruby哈希:
h = { '1' => 'a',
'2' => 'b'.
'3' => 'c',
'4' => 'd',
'5' => 'e' }
我怎样才能完成这项工作?
答案 0 :(得分:1)
我在大多数非rails项目中使用ruby Sequel。对于SQL数据库来说,这是一个很好的ORM。
以下是使用SQLite(在内存中)的代码示例:
#!/usr/bin/env ruby
require 'sequel'
# create db in memory
DB = Sequel.sqlite
# create table
DB.create_table :items do
primary_key :id
String :name
end
# Create a dataset
items = DB[:items]
# Populate the table
items.insert(:name => 'john')
items.insert(:name => 'mike')
items.insert(:name => 'nick')
puts "#{items.all}"
# => [{:id=>1, :name=>"john"}, {:id=>2, :name=>"mike"}, {:id=>3, :name=>"nick"}]
# initialize hash object
h = {}
# Create the hash in the form you want
items.all.each do |entry|
h[entry[:id]]= entry[:name]
end
# p the hash
p h # => {1=>"john", 2=>"mike", 3=>"nick"}
注意:续集非常强大。可能有一种方法可以直接执行您想要的操作,而无需通过循环传递数据。但是,您必须read the documentation了解是否需要清理代码。
希望这有帮助!
更新:所以这是Jeremy Evan(续集作者)之后的更新代码:
#!/usr/bin/env ruby
require 'sequel'
# create db in memory
DB = Sequel.sqlite
# create table
DB.create_table :items do
primary_key :id
String :name
end
# Create a dataset
items = DB[:items]
# Populate the table
items.insert(:name => 'john')
items.insert(:name => 'mike')
items.insert(:name => 'nick')
# Return hash of items
p items.select_hash(:id, :name) # => {1=>"john", 2=>"mike", 3=>"nick"}