簡體   English   中英

如何在Active Record模型上存儲臨時屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM