[英]how to store temporary attributes on an Active Record model
我想在对象上存储一些调试消息,因为它可以进行处理,但是我不想将其存储到数据库中。 像这样的合理方法吗,将实例变量包装在具有nil防护的方法中? 还是有更好的方法/模式?
class Bid < ApplicationRecord
...
def debug_reasons
@debug_reasons ||= []
end
...
接着
bid.debug_reasons << "here is a reason"
您正在寻找的是attribute
class Bid < ApplicationRecord
attribute :debug_reasons, :default => []
end
有关attribute
详细信息http://api.rubyonrails.org/v5.0/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute
出于调试目的,我将使用具有适当日志级别的日志记录。 这样,对象行为就不会与调试搞混了。
另外,可以(应该)在生产环境中禁用调试日志级别,但是在模型内部添加逻辑将使其变得不那么容易。
您可以使用本示例中的虚拟属性
我同意Bustikiller的观点,出于调试目的,记录消息是比更改生产代码更好的选择。
但是,如果您确实需要它,我将使用ruby attr_accessor
方法而不是ActiveRecord :: Base.attribute方法,因为前者不会将内部属性公开为模型属性。
模型属性应该是您的模型实现的实体的属性。 调试/内部方法(例如#object_id和#to_s)不应视为属性,因此,它们不应出现在属性列表中(即,在模型实例上调用#attributes
时)。 通过使用ActiveRecord的.attribute
,您可以将debug_messages
定义为Bid
的属性,我认为这可能不是您的Bid域的属性。
因此,使用attr_accessor
不会污染具有内部/逻辑属性的ActiveModel API。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.