在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
但是在部分内容中,我想要另一个元素集合(属于用户)并且我无法实现这一点。有更优雅的方式吗?
答案 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"}