【问题标题】:RABL - Render collection as object with the ids as keysRABL - 将集合渲染为对象,以 id 作为键
【发布时间】:2015-10-31 22:59:15
【问题描述】:

在 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

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

【问题讨论】:

  • id 等动态键对于 API 来说是一个糟糕的选择。它很难解析其他资源,因为它是动态的。恕我直言
  • @Зелёный 你为什么这么认为?我自己也问过,但我实在想不出任何理由。例如,它使我的 javascript 变得更容易。现在我可以在另一个模型具有user_id 属性时执行users[1],而不是遍历所有用户。
  • 我只是说说我的看法,因为我已经构建了一个 api 并使用名称做出选择键,另一方面 IOS 应用程序无法仅通过硬编码名称解析动态键。这只是我的意见。对于您的情况,这完全取决于您的应用程序设计。仅当用户数超过 100_000 时,循环遍历所有用户会让您感到难过,但在这里您可以将其分成几部分。简单的方法并不总是好方法。
  • 您找到解决方案了吗?那个集合是什么元素的另一个集合?请分享什么不适合你?
  • 我现在正在使用Jbuilder,这使得动态键非常容易:stackoverflow.com/questions/18154252/…

标签: ruby-on-rails json rabl


【解决方案1】:

如果可以控制 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"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2010-10-28
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多