2

我是 Sequel 和 ruby​​ 的新手,我有一件事需要你的帮助。总之,我无法使用点运算符访问数据库查询结果。我在 padrino ruby​​ 项目中使用续集适配器。例如,

persons = Person.all
persons.each do |p|
  puts p.name . # this output correct person name, as 'john'
end

但是如果我做一些查询

persons = Person.where(:age=>20)
persons.each do |p|
  puts p.name . # this line cause error 
end

我比较了它们的数据类型,并且彼此不同。

puts persons  # in first case - array
#<Gig:0x007fbdb6d64ef0>
#<Gig:0x007fbdb6d64838>
#<Gig:0x007fbdb6d641f8>

puts persons  # in second case - object
#<Sequel::Postgres::Dataset:0x007fbdbc614898>

所以我尝试在第二种情况下将结果更改为哈希数组以使用点运算符访问字段

persons_hash= persons.collect do |p|
  ro.to_hash
end

在这种情况下,我可以使用 person[0][:name] 访问用户名,但无法使用点运算符访问。

所以我想知道我应该如何使用点运算符访问 Sequel 查询结果。

谢谢 :)

4

1 回答 1

0
persons.each do |p|
  puts p.name . # this line cause error 
end

你在这里遇到什么确切的错误?我猜是未定义的方法错误?似乎您可能熟悉 ActiveRecord 语法。我自己没用过sequel,不过和AR有点不一样。根据他们的文档,你会做这样的事情

persons.map(:name) # => ['Harry', 'Steve', 'Israel', ...]

all 方法返回一个哈希数组,其中每个哈希对应一个记录。

对于您上面的示例,我将尝试以下操作:

persons.each do |p|
  puts p[:name] . # here we are now accessing the name hash key instead of trying to access the name method.
end

您想要访问每个被迭代的哈希的名称键。因为您正在遍历一个哈希数组。这就是为什么您可以使用person[0][:name]. 您正在调用角色数组的第 0 项并访问其“名称”哈希键。

于 2020-07-06T10:27:49.767 回答