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

时间:2013-11-26 08:22:39

标签: ruby-on-rails ruby hash

我有以下代码片段来从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" }]

我想转换" id"从stringfixnum。 Id在db中是整数。最干净的方法是什么?

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

4 个答案:

答案 0 :(得分: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 :(得分: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

无论如何只要离开那里。

答案 2 :(得分: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

答案 3 :(得分:-1)

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

def hash_values_to_string(hash)
  hash.keys.each {|k| hash[k]=hash[k].to_s}; hash
end