将字段添加到 Rails 模型而不将它们保存在 Rails 的数据库中

Eri*_*win 2 ruby json ruby-on-rails ruby-on-rails-3

我正在渲染基于表示 Rails 模型的 JSON 对象的视图。这个 JSON 对象需要不属于 Rails 模型的字段,所以我将它们添加到控制器中,如下例 1 所示:

#Controller
events = Event.where(<query>).each do |event|
    event[:duration] = (event.end - event.start)/3600
    event[:datatime] = event.start.hour + event.start.min/60.0
    ...
end

render json: events
Run Code Online (Sandbox Code Playgroud)

这可以正确呈现我的数据。但是,我收到以下弃用警告:

DEPRECATION WARNING: You're trying to create an attribute `duration'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc.
Run Code Online (Sandbox Code Playgroud)

我想重写我的代码以避免此警告。如果我尝试将这些额外字段视为标准对象属性,则无法正确呈现这些值。下面是我尝试更改为使用标准对象属性:

#Controller
events = Event.where(<query>).each do |event|
    event.duration = (event.end - event.start)/3600
    event.datatime = event.start.hour + event.start.min/60.0
    ...
end

render json: events



#Model
class Event < ActiveRecord::Base
  include ActiveModel::AttributeMethods
  attr_accessor :duration, :datatime
Run Code Online (Sandbox Code Playgroud)

这会导致字段被填充undefined。如果我使用attr_writer而不是attr_accessor. 我该如何解决这个问题?我是被迫将这些临时属性存储在数据库中还是我只是使用了错误的语法?

inf*_*sed 5

如果要读取和写入访问器,请使用attr_accessor

class Event < ActiveRecord::Base
  attr_accessor :duration, :datatime
end
Run Code Online (Sandbox Code Playgroud)

您无需包含ActiveModel::AttributeMethods即可使用attr_accessor.

要在 JSON 中包含访问器,请告诉 render 包含它们:

render json: events, methods: [:duration, :datatime]
Run Code Online (Sandbox Code Playgroud)