如何在Active Record模型上存储临时属性

时间:2018-01-03 19:38:18

标签: ruby-on-rails ruby

我想在一个对象上存储一些调试消息,因为它可以通过处理,但我不想将它存储到数据库中。这样的事情是否合理,一个实例变量包含在一个带有nil guard的方法中?或者有更好的方式/模式?

class Bid < ApplicationRecord
  ...
  def debug_reasons
     @debug_reasons ||= []
  end
  ...

然后

bid.debug_reasons << "here is a reason"

4 个答案:

答案 0 :(得分:4)

您正在寻找的是attribute

class Bid < ApplicationRecord
  attribute :debug_reasons, :default => []
end

有关attribute http://api.rubyonrails.org/v5.0/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute

的更多信息

答案 1 :(得分:0)

出于调试目的,我将使用具有适当日志级别的日志记录。这样,对象行为不会搞乱调试。

此外,可以(应该)在生产环境中禁用调试日志级别,但在模型中添加逻辑将不会那么容易。

答案 2 :(得分:0)

您可以使用this example

中的虚拟属性

答案 3 :(得分:0)

我同意Bustikiller,出于调试目的,记录消息是一个更好的选择,而不是更改您的生产代码。

但是,如果你确实需要它,我会使用ruby attr_accessor方法而不是ActiveRecord::Base.attribute方法,因为前者不会将内部属性公开为模型属性。

模型属性应该是模型实现的实体的属性。调试/内部方法(例如#object_id和#to_s)不应被视为属性,因此它们不应出现在属性列表中(即,当您在模型实例上调用#attributes时)。通过使用ActiveRecord中的.attribute,您可以将debug_messages定义为Bid的属性,我认为该属性可能不属于您的出价域的属性。

因此,使用attr_accessor,您不会使用内部/逻辑属性污染ActiveModel API。