RABL - 将集合渲染为对象,并将id作为键

时间:2015-08-08 15:41:00

标签: ruby-on-rails json rabl

在Ruby on Rails 4中,我正在尝试为我的网站制作一个API而不是像这样使用数组:

[{id: 1, name: "John"}, {id: 2, name: "Foo"}, {id: 3, name: "Bar"}]

我想像这样渲染它,因为它可以更容易地在javascript中搜索(以及其他原因):

{"1": {id: 1, name: "John"}, "2": {id: 2, name: "Foo"}, "3": {id: 3, name: "Bar"}}

这有效:

# users/index.rabl

@users.each do |user|
  node(users.id.to_s) do
    partial('api/v1/users/show', object: user)
  end
end

但是在部分内容中,我想要另一个元素集合(属于用户)并且我无法实现这一点。有更优雅的方式吗?

1 个答案:

答案 0 :(得分:0)

如果能够控制API后端代码库,那么选择hash-map而不是数组肯定是更好的选择。从BigO表示法哈希查找以恒定的O(1)时间发生,而不是像数组一样发生O(n)。

数据库中的主键查找是查询数据的最佳方式。主键通常很短并且始终编入索引。如果是大数据集,请使用分页。

让我们假设没有RABL(你总是可以在RABL DSL代码中实例化纯Ruby类),但只是一个数组:

array = [{id: 1, name: "John"}, {id: 2, name: "Foo"}, {id: 3, name: "Bar"}]
hash  = {}
array.each{ |elem,i| hash[elem[:id].to_s] = elem }

# {"1"=>{:id=>1, :name=>"John"}, "2"=>{:id=>2, :name=>"Foo"}, "3"=>{:id=>3, :name=>"Bar"}}

要将Ruby哈希传递给客户端上的Javascript,您可能需要对其进行适当编码:

# hash.to_json
# {"1":{"id":1,"name":"John"},"2":{"id":2,"name":"Foo"},"3":{"id":3,"name":"Bar"}}

从Javascript您可以通过密钥查询哈希:

hash = {"1":{"id":1,"name":"John"},"2":{"id":2,"name":"Foo"},"3":{"id":3,"name":"Bar"}}
hash[1]
# Object { id=1,  name="John"}