我想在一个对象上存储一些调试消息,因为它可以通过处理,但我不想将它存储到数据库中。这样的事情是否合理,一个实例变量包含在一个带有nil guard的方法中?或者有更好的方式/模式?
class Bid < ApplicationRecord
...
def debug_reasons
@debug_reasons ||= []
end
...
然后
bid.debug_reasons << "here is a reason"
答案 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。