在Rails中如何在无表模型上使用模型的Attribute API

时间:2019-04-09 17:38:37

标签: ruby-on-rails activerecord attributes ruby-on-rails-5 activemodel

我有一个这样的无表模型:

class SomeModel
    include ActiveModel::Model
    attribute :foo, :integer, default: 100
end

我正在尝试使用以下链接中的属性,该属性在普通模型中可以正常使用,但是无法在无表模型中使用。

https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html

这将导致未定义

我尝试添加活动记录属性:

include ActiveRecord::Attributes

也作为包含内容,但这会导致与架构相关的其他错误。

如何在无表模型中使用该属性?谢谢。

2 个答案:

答案 0 :(得分:1)

您需要包括ActiveModel::Attributes

class SomeModel
  include ActiveModel::Model
  include ActiveModel::Attributes
  attribute :foo, :integer, default: 100
end

由于某种原因,它未包含在ActiveModel::Model中。该内部API是从Rails 5的ActiveRecord中提取的,因此您可以将其用于无表模型。

请注意,ActiveModel::AttributesActiveRecord::Attributes相同的内容。 ActiveRecord::Attributes是一种更专业的实现,它假定模型由数据库模式支持。

答案 1 :(得分:0)

您可以使用attr_writer

class SomeModel
  include ActiveModel::Model
  attr_writer :foo

  def foo
    @foo || 100
  end
end