我对Ruby和数据库仍然相当新,我正在努力学习如何将两者结合使用。我已经浏览了几个在线教程,但是还没有能够解决一些问题。我正在使用PostgreSQL,我只是尝试读取数据库中的数据并以某种方式操作实际单元格中包含的数据。从教程我有以下功能:
def queryUserTable
@conn.exec( "SELECT * FROM users" ) do |result|
result.each do |row|
yield row if block_given?
end
end
end
并且打印出行中信息的简单方法就像
p.queryUserTable {|row| printf("%s %s\n", row['first_name'], row['last_name'])}
(p
是连接)。然而,所有这一切都是在整个指定的行和列中打印出每个值,然后继续到下一行。我想知道的是我如何能够获取第一列下第1行中的值并将其用于其他内容?从我的理解,看起来行是哈希,所以我应该能够做类似于{|row, value| @my_var = value }
的事情,但我没有得到这样的结果,所以我不明白这一切是如何正常的。我希望有人可以更好地解释这是如何工作的。希望有道理。谢谢!
编辑:
在我的函数中是否与此行有关?:
result.each do |row| #do I need to add |row,value| here as well?
答案 0 :(得分:1)
您是否有理由不使用像ActiveRecord这样的ORM?虽然它确实有一些缺点,但对于那些不熟悉数据库和ruby的人来说,它可能会有所帮助。如果您需要有关活动记录和轨道的教程,我强烈推荐Michael Hartl的免费教程[1]。
我不确定你要做什么,但我可以纠正一些错误观念。首先,结果不是哈希 - 它是一个哈希数组。这就是为什么result.each { |row, value| ...
没有初始化value
的原因。一旦有了单独的行,就可以row.each { |col_name, val| ...
其次,如果要从特定行中获取值,则应在查询中指定行。您必须了解有关您想要了解的行的信息。用于获取id = 1
的用户,例如:
user = @conn.exec("SELECT first_name FROM users WHERE id = 1").first
unless user.nil?
# do something with user["first_name"]
如果你要使用activerecord,你可以这样做
user = User.findById(1)
我不想在queryUserTable循环中设置值,因为它将在每个循环上设置,并保留上次执行时的值。