17

我需要产生哈希的循环,而不是对象数组。我有这个:

json.service_issues @service.issues do |issue|
  json.set! issue.id, issue.name
end

结果:

service_issues: [
  {
    3: "Not delivered"
  },
  {
    6: "Broken item"
  },
  {
    1: "Bad color"
  },
  {
    41: "Delivery problem"
  }
]

我需要这个:

service_issues: {
   3: "Not delivered",
   6: "Broken item",
   1: "Bad color",
   41: "Delivery problem"
}

是否可以在不手动将 AR 结果转换为哈希的情况下执行此操作?

4

3 回答 3

31

Jbuilder 开发人员在这里。

简短的回答:是的。无需将模型数组转换为哈希即可。

json.service_issues do
  @service.issues.each{ |issue| json.set! issue.id, issue.name }
end

但事先准备哈希可能会更容易。

json.service_issues Hash[@service.issues.map{ |issue| [ issue.id, issue.name ] }]
于 2013-04-10T05:27:09.170 回答
2

这个问题已经很老了,但是对于任何对数组(对象)的哈希感兴趣的人,您可以使用以下代码:

@bacon_types.each do |bacon_type|
json.set! bacon_type.name, bacon_type.bacons do |bacon|
    bacon.title bacon.title
    ...
end
于 2013-10-04T11:53:38.147 回答
0

你可以这样做

Jbuilder.encode do |json|
  json.service_issues @service.issues.inject({}) { |hash, issue| hash[issue.id] = issue.name; hash }
end 

代码生成哈希技术可以通过下面的例子来理解。

[1] pry(main)> array = [{id: 1, content: 'a'}, {id: 2, content: 'b'}]
=> [{:id=>1, :content=>"a"}, {:id=>2, :content=>"b"}]
[2] pry(main)> array.inject({}) { |hash, element| hash[element[:id]] = element[:content]; hash }
=> {1=>"a", 2=>"b"}

inject生成哈希的关键点,每次插入新元素后返回创建的哈希。上面的例子,它是通过 实现的; hash

于 2013-04-10T03:15:10.267 回答