我有一个Place
模型和一个PlacesController
. 目前,控制器使用某些对象响应 JSON。我想为响应的对象添加更多字段。例如,我想添加每个地方的标签,通过方法查询Place.tags
。
我正在考虑两种解决方案:将对象列表转换为哈希列表并添加我想要的属性,或者在模型中添加一个新列,将其填充到迭代对象列表的控制器中。我不确定是否有更好的方法来做到这一点。
我有一个Place
模型和一个PlacesController
. 目前,控制器使用某些对象响应 JSON。我想为响应的对象添加更多字段。例如,我想添加每个地方的标签,通过方法查询Place.tags
。
我正在考虑两种解决方案:将对象列表转换为哈希列表并添加我想要的属性,或者在模型中添加一个新列,将其填充到迭代对象列表的控制器中。我不确定是否有更好的方法来做到这一点。
我假设:
class Place < ActiveRecord:Base
has_many :tags
如果是这样,您是否只是尝试将关联的标签添加到地点对象的 json 中?如果是这样,您可以使用(其中 'place' 是 Place 对象):
place.to_json(:include=>:tags)
您也可以使用模板来生成 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
在这种情况下,我可能会使用演示者模式。看看这里:http ://blog.jayfields.com/2007/03/rails-presenter-pattern.html
如果您有专业帐户,还有一个 railscast:http ://railscasts.com/episodes/287-presenters-from-scratch
我不确定我的解决方案是更好的方法
# in controller
@place = Place.first
@place[:place_tags] = @place.tags.map(&:attributes)
render :json => @place