产生哈希的 JBuilder 循环

Posted

技术标签:

【中文标题】产生哈希的 JBuilder 循环【英文标题】:JBuilder loop that produces hash 【发布时间】:2013-03-31 09:19:14 【问题描述】:

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

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 结果转换为哈希的情况下执行此操作?

【问题讨论】:

【参考方案1】:

这里是 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 ] ]

【讨论】:

@RichardCook 你不知道。 javascript 对象键始终是字符串。因此,在 javascript 中 myObject[2] 完全等同于 myObject['2']。 第一种方法的问题是,如果没有@service.issues,你不会得到一个空的散列,key 不会出现在 JSON 中(根据我的经验)。 【参考方案2】:

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

@bacon_types.each do |bacon_type|
json.set! bacon_type.name, bacon_type.bacons do |bacon|
    bacon.title bacon.title
    ...
end

【讨论】:

【参考方案3】:

你可以这样做

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的关键点,每次插入新元素后返回创建的hash。上例,通过; hash实现。

【讨论】:

以上是关于产生哈希的 JBuilder 循环的主要内容,如果未能解决你的问题,请参考以下文章

JAVA学期末了,老师让在JBUILder里做一个类似猜数字的小游戏,利用Math.random(),随机产生0-9的整数,但

在 html 视图中呈现 JBuilder 视图

JBuilder 2006 企业完整版

Jbuilder 部分缓存未添加到输出中

如何在 Jbuilder 和 Normalizr 之间展平数据

如何将 JBuilder 视图的 JSON 表示呈现为字符串?