0

我有一个Place模型和一个PlacesController. 目前,控制器使用某些对象响应 JSON。我想为响应的对象添加更多字段。例如,我想添加每个地方的标签,通过方法查询Place.tags

我正在考虑两种解决方案:将对象列表转换为哈希列表并添加我想要的属性,或者在模型中添加一个新列,将其填充到迭代对象列表的控制器中。我不确定是否有更好的方法来做到这一点。

4

4 回答 4

5

我假设:

 class Place < ActiveRecord:Base
   has_many :tags

如果是这样,您是否只是尝试将关联的标签添加到地点对象的 json 中?如果是这样,您可以使用(其中 'place' 是 Place 对象):

 place.to_json(:include=>:tags)
于 2013-02-05T18:17:42.180 回答
1

您也可以使用模板来生成 JSON。它可以让您控制 JSON 中出现的内容,并且比通过 to_json 或 render :json 渲染要快得多。

在此处查看我关于呈现 JSON 的最快方法的问题:What is the faster way to render json in rails

我发现 RABL ( https://github.com/nesquena/rabl ) 快速且易于设置。

对于您的示例,在 RABL 中,您将执行以下操作:

class PlacesController < ApplicationController
  def show
    @place = Place.find(params[:id])
  end
end

在视图中:

object @place => :place
attributes :id, :name

children :tags => :tags do
  attributes :id, :name
end
于 2013-02-05T18:24:46.660 回答
0

在这种情况下,我可能会使用演示者模式。看看这里:http ://blog.jayfields.com/2007/03/rails-presenter-pattern.html

如果您有专业帐户,还有一个 railscast:http ://railscasts.com/episodes/287-presenters-from-scratch

于 2013-02-05T18:12:24.537 回答
-1

我不确定我的解决方案是更好的方法

# in controller
@place = Place.first
@place[:place_tags] = @place.tags.map(&:attributes)
render :json => @place
于 2013-02-05T18:17:31.043 回答