データベースの一部のフィールドで暗号化を使用する必要があるアプリケーションがあります。これは現在、含まれるクラスのフィールドの暗号化と管理の詳細を処理する懸念を使用して実装されています。どのクラスにこの問題が含まれているかをシステムがプログラムで判断できることが重要ですが、さらに具体的には、どのフィールドが暗号化されているかをプログラムで判断する適切な方法が必要です。
今日、これは次のようなクラス変数を使用して実装され、機能しています。
module EncryptedFields
extend ActiveSupport::Concern
included do
@@encrypted_attributes ||= {}
@@encrypted_attributes[self.to_s] ||= []
def self.encrypted attribute, options={}
@@encrypted_attributes[self.to_s] << attribute
### Other stuff
end
end
end
次のように、クラスに含まれます。
class SomeEcryptedModel
include EncryptedFields
encrypted :field_name, options
encrypted :other_field_name, options
#etc
end
クラス変数@@encrypted_attributes
は、含まれているクラス名をキーとして、暗号化された属性の配列を値として、キーと値のペアのハッシュを正しくキャプチャします。暗号化されたモデルがそれ自体とその属性を使用して「登録」するための登録システムを使用することを検討しましたが、これに関連するオーバーヘッドがはるかに多く、私のタイムラインでは、それほど安全でない場合は、より単純なものから始めたいと考えています.
これは現在のアプリケーションで実際にうまく機能していますが、懸念やクラス変数の経験があまりないため、これがどのように動作するかについて重大な誤算をしていないか心配しています. ここの落とし穴はどこですか?Ruby を使い始めてから (それほど前ではありませんが)、クラス変数は一般的に避けるようにプログラムされています。
最初はクラス変数が含まれるクラスのクラス変数になると思っていたので、私はこれに一度噛まれまし@@encrypted_attributes
た。これは明らかにそうではありませんでした。それを含む新しいモデルごとにそれが上書きされるため、このクラス変数自体が明らかに問題であるという結論に達しました。少なくとも、これは私が目撃しているように見える行動です。暗号化されたモデルの完全なリストを取得できるようになったため、これは最終的により望ましい動作であることが判明しました。これには、ロードされたモデルの暗号化されたモデルと属性のリストしか返せないという明らかな制限があります。
だから、私の質問:
これはクラス変数の適切な使用例ですか、それとも同じ情報を取得する別の (より良い?) 方法はありますか? これが受け入れられるクラス変数の使用例である場合、コードが意図したとおりに機能することを保証するために追加する必要がある落とし穴や保護は何ですか?
多分私はあまりにも賢くしようとしているだけで、リストをハードコーディングする必要がありますか? 助けてくれてありがとう!