【问题标题】:Create JSON from database query rails从数据库查询轨道创建 JSON
【发布时间】:2015-06-01 05:17:12
【问题描述】:

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

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

我想在控制器中创建一个表达式,它可以以所需的格式输出 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 成为源,followed_id 成为目标?

【问题讨论】:

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


    【解决方案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 或其他什么,那里有一大堆

    但是,不应低估从这样的控制器渲染 JSON 被认为是一种难闻的气味。在控制器中拥有视图代码违反了基于 Rails 的 MVC。

    这给我们留下了第 2 种选择的味道,只要与手头任务的复杂性相匹配(根据您自己的直觉)。

    希望这会有所帮助!

    【讨论】:

    • 好的,谢谢,这很有帮助。 JBuilder 看起来很容易使用。我唯一不明白的是如何实际引用 Jbuilder 创建的 json。它不会创建物理文件,所以当我尝试在 ajax 调用中使用它时,我将其称为什么?
    • 我可能不是 100% 真正理解你,但是......它与 Rails 中的任何其他视图引擎非常相似。它作为 Rails 控制器动作的一部分被调用。所以默认情况下结果直接写入响应流。就像“ERB (HAML/SLIM/whatever) to HTML”一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2015-03-22
    相关资源
    最近更新 更多