代码之家  ›  专栏  ›  技术社区  ›  timpone

如何在活动记录模型上存储临时属性

  •  4
  • timpone  · 技术社区  · 8 年前

    我想在对象上存储一些调试消息,因为它可以进行处理,但我不想将其存储到数据库中。这样的方式合理吗?将实例变量包装在具有零保护的方法中?还是有更好的方式/模式?

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

    然后

    bid.debug_reasons << "here is a reason"
    
    3 回复  |  直到 8 年前
        1
  •  9
  •   Josh Brody    8 年前

    你要找的是 attribute

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

    有关的详细信息 属性 http://api.rubyonrails.org/v5.0/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute

        2
  •  0
  •   Bustikiller    8 年前

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

    此外,可以(应该)在生产环境中禁用调试日志级别,但在模型中添加逻辑并不会使其变得如此简单。

        3
  •  0
  •   Daniel    8 年前

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

    但是,如果你真的需要,我会用红宝石 attr_accessor 方法而不是 ActiveRecord::Base.attribute 方法,因为前者不将内部属性作为模型属性公开。

    模型属性应该是模型实现的实体的属性。调试/内部方法(如#object\u id和#to\u s)不应被视为属性,因此,它们不应出现在属性列表中(即调用 #attributes 在模型实例上)。通过使用 .attribute 在ActiveRecord中,您可以定义 debug_messages 作为的属性 Bid 我认为,这可能不是您的投标域名的财产。

    所以,使用 属性存取器 您不会用内部/逻辑属性污染ActiveModelAPI。

    推荐文章