Ruby将哈希中的所有值转换为字符串

问题描述 投票:0回答:4

我有以下代码片段从db中获取某些列:

 @data =  Topic.select("id,name").where("id in (?)",@question.question_topic.split(",")).map(&:attributes)

在生成的哈希数组中,它是:

当前:

@data =    [ { "id" => 2, "name" => "Sports" }]

要改为:

@data =    [ { "id" => "2", "name" => "Sports" }]

我想从string将“id”转换为fixnum。 Id在db中是整数。最干净的方法是什么?

注意:使用.map(&:attributes)后,它不是活动记录关系。

ruby-on-rails ruby hash
4个回答
2
投票

您可以使用正确的map用法:

topics = Topic.select("id,name").where("id in (?)",@question.question_topic.split(","))
@data = topics.map do |topic|
  {
    'id' => topic.id.to_s,
    'name' => topic.name
  }
end

1
投票

您正在寻找的只是简单的

@data.each { |obj| obj["id"] = obj["id"].to_s }

实际上没有一种更简单的方法(我认为无论如何都很简单)。

通过标题来表示一个不同的问题 - 将哈希值中的每个值转换为字符串,您可以执行此操作:

@data.each do |obj| 
  obj.map do |k, v|        
      {k => v.to_s} 
  end
end

无论如何只要离开那里。


0
投票

你可以在这里使用Ruby's #inject

@data.map do |datum|
  new_datum = datum.inject({}) do |converted_datum, (key, value)|
    converted_datum[key] = value.to_s

    converted_datum
  end
end

无论密钥如何,这都可以将所有值转换为字符串。

如果您正在使用Rails,它可以更清洁Rails' #each_with_object

@data.map do |datum|
  datum.each_with_object({}) do |(key, value), converted_datum|
    converted_datum[key] = value.to_s
  end
end

-1
投票

这将迭代哈希中的所有键名,并将该值替换为与键关联的基准的#to_s版本。 nil被转换为空字符串。此外,这假设您在散列中没有复杂数据,如嵌入式数组或其他散列。

def hash_values_to_string(hash)
  hash.keys.each {|k| hash[k]=hash[k].to_s}; hash
end
© www.soinside.com 2019 - 2024. All rights reserved.