在Rails中将属性附加到模型对象

时间:2013-02-05 18:06:50

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

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

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

4 个答案:

答案 0 :(得分:4)

我假设:

 class Place < ActiveRecord:Base
   has_many :tags

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

 place.to_json(:include=>:tags)

答案 1 :(得分:1)

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

查看我关于在这里呈现JSON的最快方式的问题:What is the fastest 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

答案 2 :(得分:0)

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

如果您拥有专业版帐户,还可以使用railscast:http://railscasts.com/episodes/287-presenters-from-scratch

答案 3 :(得分:-1)

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

# in controller
@place = Place.first
@place[:place_tags] = @place.tags.map(&:attributes)
render :json => @place