如何使用新属性扩展ActiveRecord模型?

时间:2015-01-24 22:11:08

标签: ruby-on-rails ruby activerecord

我正在开发REST API,在将结果(从带有ACtiveRecord的数据库中获取)发送到客户端之前,我需要使用一些额外的数据来扩展它。以下是我的假设:

  def index
    (categories = Category.all()).each() do |category|
      category.image = "some image"
    end
    render json: categories
  end

似乎Ruby不会像JS那样动态添加对象比例,所以这段代码最终会出现错误消息

undefined method `image=' for #<Category:0x007f89f0513d40> 

我阅读了很多内容并找到了在attr_accessor :image模型中添加Category的解决方案。现在它不会抛出错误,但JSON输出中也没有出现image属性。

2 个答案:

答案 0 :(得分:3)

不是自己玩这个对象,你可能需要花几分钟来了解jbuilder是如何工作的,它非常简单,它会让你的生活变得更轻松,特别是当json格式包含一个来自原始数据库对象的额外/不同数据, 这是您可能做的简单格式

# app/views/categories/index.json.jbuilder
json.array! @categories do |category|
  json.prop1 category.prop1
  json.prop2 category.prop2
  json.image whatever_image_function_here
end

其他解决方案将覆盖类

as_json方法

答案 1 :(得分:1)

在类别模型中使用as_json方法与attr_accessor :image

def index
  categories = Category.all.each do |category|
    category.image = 'some image'
  end
  render json: categories.as_json(methods: :image)
end

在rails&lt; 4.2它有不同的名称 - to_json