【问题标题】:Convert two models attribute in a json response在 json 响应中转换两个模型属性
【发布时间】:2013-03-05 01:36:23
【问题描述】:

我在 ruby​​ on rails 上,我有两个模型,目标是在两个模型上搜索网站,我使用 twitter typeahead 但我遇到的问题是 json 必须是一个对象。

我不确定将两个对象合二为一的最佳方法是什么。代码在这里

@users= Search.user(params[:query])
@articles= Search.article(params[:query])
respond_to do |format|
  format.html # index.html.erb
  format.json {
    render :json => {
     :art=> @articles.map(&:title),
     :user=> @users.map(&:first_name)
  }}
  end
end

我不确定最好的方法是什么,或者我似乎找不到将这两个模型合并为一个的最佳文档。我不知道 to_json、as_json 还是 concat 会是最好的。

这个想法是从

获得以下json的结果
{"art":["John","Serge","Dean","feng","Heather"],"user":["Ontario high school teachers drop next week's walkout plan","Air Canada to appeal Quebec court ruling on Aveos"]}

到下面

{"result":["John","Serge","Dean","feng","Heather", "Ontario high school teachers drop next week's walkout plan","Air Canada to appeal Quebec court ruling on Aveos"]}

【问题讨论】:

  • 你试图返回 json 请求是什么?在那里你得到了几个用户和文章,然后你用一个散列来回答,其中键 :art 指向文章标题的数组,键 :user 指向用户的 first_name 数组。跨度>
  • 这个想法只是文章和用户的数组,所以我可以在我的自动完成中输出结果

标签: ruby-on-rails ruby json ruby-on-rails-3


【解决方案1】:

因此,如果您想获取用户和文章的数组:

respond_to do |format|
  format.json  { render :json => {:art => @articles, 
                                  :user => @users }}

  end
end

根据您的编辑:

format.json {
  render :json => {
    result => @articles.map(&:title) | @users.map(&:first_name)
}}

根据最后的评论,只捕获 nil 问题:

format.json {
  render :json => {
    result => (@articles.map(&:title) || []) | (@users.map(&:first_name) || [])
}}

【讨论】:

  • 但我不希望它是两个不同的数组,我希望它遵循 {"res":["John","Serge","Dean","feng","Heather ","Carmen","test", "原住民与总理的会面处于危险之中",...}
  • 如果它是 nilclass,我会遇到问题
  • @Jseb 查看我关于 json 模板的回答。你可以很容易地设置你想要的 json
  • @jamesw 这对于复杂的 json 结果来说很好,但是他想要回馈的是一个简单的 json 结果,构建一个新视图并使用构建器不是一个实用的解决方案
  • @rorra json 模板没有什么不实用的。易于设置,只需极少的时间即可生产,并且完全可配置以满足您的需求。 Jseb 显然在努力产生所需的输出,模板以我相信 Jseb 会觉得直观的方式解决问题。
【解决方案2】:

我可以建议您使用 JSON 视图模板吗?您有很多选择,但最流行的两个是 RABL 和 JBuilder。我强烈推荐 RABL gem。

它们受欢迎是有原因的,它们使渲染 json 变得轻而易举

你可以在这里找到 RABL gem https://github.com/nesquena/rabl

你可以在这里找到 JBuilder gem https://github.com/rails/jbuilder

两者都有优秀的 railsast 展示如何使用它们。

RABL http://railscasts.com/episodes/322-rabl

JBuilder http://railscasts.com/episodes/320-jbuilder

我赞成 RABL 纯粹是出于个人喜好,你应该看看这两个选项,看看哪个最适合你。

我通常不建议添加 gem,但我认为您会发现这些解决方案中的任何一个都可以满足您的需求

【讨论】:

  • 我正在阅读 rabl,我唯一感到困惑的是我不认为它们是关联的,我需要有孩子,还是有其他方法可以简单地渲染两个对象
  • 这取决于您希望如何输出 json。如果符合您的要求,您可以只使用节点,也可以使用子节点。最好的办法是展示 json 应该如何渲染,然后操作模板来生成你需要的 json
猜你喜欢
  • 2015-08-11
  • 2021-02-13
  • 2019-09-15
  • 2013-10-31
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多