从数据库查询轨道创建JSON

时间:2015-06-01 05:17:13

标签: javascript ruby-on-rails json d3.js

我想将我的rails应用程序数据的强制布局图创建为here in d3

我有一个带有表格的rails应用程序,如下图所示:

enter image description here

我想在控制器中创建一个表达式,可以输出所需格式的JSON:

{
  "user":[
    {"name":"Myriel"},
    {"name":"Napoleon"},
    {"name":"Mlle.Baptistine"}
  ],
  "relationship":[
    {"source":1,"target":0},
    {"source":2,"target":0},
    {"source":3,"target":0}
 ]
}

我想这会涉及控制器中的查询 - 例如:

class GraphController < ApplicationController
  def data
  render :json =>  User.select('name')
  render :json =>  Relationship.select('follower_id') & Relationship.select('followed_id') 
  end
end

但是如何根据上面的示例将json输出合并为一个?以及如何重命名输出,以便follower_id成为源,follow_id成为目标?

1 个答案:

答案 0 :(得分:1)

你有很多选择:

  1. 您可以构建适当的结构,然后将其传递给render,就像这样:

    render json: {
      user: User.select('name')].map { |u|
        { name: u.name }
      },
      relationship: Relationship.select(:follower_id, :followed_id).map { |r|
        { source: r.follower_id, target: r.followed_id }
      }
    }
    
  2. 前一种方法有效,但可能变得相当复杂。此时,您可能应该考虑通过单独的视图层进行JSON渲染。它可以是你喜欢的任何东西:

    • ERB,这是非常奇特的,我在野外从未见过它,但仍然非常可行;您应该可以将模板命名为show.json.erb,然后从那里开始
    • 一个单独的类,它将构建类似于选项号的结构。 1用JSON渲染,一种演示者
    • ...最后,这对我来说是最合适的,一些特定于JSON的渲染引擎:RABL,JBuilder或者其他什么,那里有一大堆
  3. 然而,不应低估从这样的控制器渲染JSON被认为是难闻的气味。在控制器中拥有视图代码会违反MVC,即基于Rails的Rails。

    这给我们留下了选项#2的味道,无论与手头任务的复杂程度相匹配(根据你自己的直觉)。

    希望这有帮助!