2015-08-08 63 views
3

在Ruby对象,我试图让一个API,我的网站,而不是使用这样一个数组:Rabl的 - 渲染收款作为与ID作为on Rails的4个按键

[{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 

但是在部分中,我想要另一个元素集合(属于用户),我无法实现这个工作。有没有更优雅的方式来做到这一点?

+0

动态密钥如'id'是API的不好选择。很难解析其他资源,因为它是动态的。恕我直言 –

+0

@Зелёный你为什么这么认为?我也是自己问的,但我没有想到任何理由。例如,它使我的JavaScript更容易。现在,只有当另一个模型具有user_id属性时,才可以执行'users [1]',而不是遍历所有用户。 – hansottowirtz

+0

我只是说我的意见,因为我已经建立了一个API,并选择与名称的关键,另一方面,iOS应用程序不能通过硬编码名称解析动态密钥。这只是我的看法。对于你的情况,这全是关于你的应用程序设计。只有当用户数超过100_000时,循环遍历所有用户才会让你感到难过,但在这里你可以将它分成几部分。简单的方法并不总是一个好方法。 –

回答

0

若要控制API后端代码库,选择哈希映射而非数组绝对是更好的选择。从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"}} 

要通过红宝石哈希为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"}