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

How can I extend ActiveRecord model with new propery?

我正在开发 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> 

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

与其自己玩弄对象,不如花几分钟时间了解 jbuilder 的工作原理,它非常简单,会让您的生活轻松很多,尤其是 json 格式时包含来自原始数据库对象的一些 extra/different 数据, 这是您可以执行的操作的简单格式

# 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

其他解决方案是覆盖 class

as_json 方法

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

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

在 rails < 4.2 中它有不同的名称 - to_json