データベースの一部のフィールドで暗号化を使用する必要があるアプリケーションがあります。これは現在、インクルードされたクラスのフィールドの暗号化と管理の詳細を処理する問題を使用して実装されています。システムがこの問題を含むクラスをプログラムで決定できることは重要ですが、さらに具体的にはプログラムによってどのフィールドが暗号化されているかを判断する良い方法が必要です。Ruby ActiveSupport :: Concernでクラス変数を使用する代わりに
今日、これは、このようなクラス変数を使用して、働いて、実装されています。
クラスに含ま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
が含まれているクラスのクラス変数になると考えていたので、これで既に噛まれました。これは明らかにそうではありませんでした。それを含む新しいモデルがすべてそれを上書きするので、私はこのクラス変数が明らかに懸念そのものであったという結論に達しました。少なくとも、これは私が目撃しているように見える行動です。暗号化されたモデルの完全なリストを得ることができるので、これは最終的により望ましい動作であることが判明しました。これは、ロードされたモデルの暗号化されたモデルと属性のリストのみを返すことができるという明らかな制限があります。
だから、私の質問:
が、これはクラス変数のための適切な使用のケースです、またはこれと同じ情報を取得するための代替(よりよい?)方法はありますか?これが許容可能なクラス変数のユースケースである場合、私が意図したとおりにコードが動作するようにするために加えるべき落とし穴や保護のいくつかはありますか?
たぶん私はあまりにも賢い人にしようとしています。助けてくれてありがとう!
ありがとう:クラス変数とクラスのインスタンス変数の違いについて
良い記事。これは教育的な答えでした。質問のためにコードを簡略化したので、これは正確にはうまくいかないかもしれませんが、私は新しい方向に考えていました。 – BoringJangles