【问题标题】:How to access Sequel result with dot operator in ruby?如何在 ruby​​ 中使用点运算符访问 Sequel 结果?
【发布时间】:2018-06-10 08:09:38
【问题描述】:

我是 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 查询结果。

谢谢:)

【问题讨论】:

  • 我认为这两个人都是Person::ActiveRecord_Relation类型。
  • 这个点本身有什么作用?我不知道那是合法的 Ruby。点运算符通常表示在前一个对象上调用以下方法。
  • @KeithBennett 请参阅下面我的回答。您正在迭代一个哈希数组。您需要访问哈希键“名称”。您通过使用点来使用名称方法。这适用于 activerecord ORM,但不适用于续集。它们有不同的语法,
  • @nolyoi 您会使用点号来调用名称方法,例如person.name,而不是person.name .,不是吗?我问的是.,后面什么都没有。
  • @KeithBennett 哦,我什至没有注意到这一点。老实说,我以前从未见过这种方式。

标签: ruby padrino dot-operator


【解决方案1】:
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 项并访问其“名称”哈希键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 2011-09-05
    • 2011-05-14
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多