2011-07-19 13 views
0

ビットフィールドを使用してユーザー設定を保存するRuby on Railsアプリケーションがあります。私は現在、ユーザーの既存のアクセス許可に基づいて既定のセットを持つ必要があるビットを追加しています。たとえば、ユーザーが許可 'A'または 'B'を持っている場合、ユーザーは自動的に許可 'C'を取得します。 UPDATE ALL問合せでこれを実行する方法はありますか?移行中追加されたパーミッションのビットフィールドを素早く更新する

+2

モデル/スキーマ情報を追加して、役立つコンテキストを持てますか? –

+0

これはビジネスルールのような匂いがします。これは論理がモデルに組み込まれるべきであることを意味します。もちろん、マイグレーションにはワンタイムアップデートが必要です。これはあなたが求めていると思います。 Jeffは言うように、あなたのスキーマについてもっと知る必要があります。 – Andy

答えて

2

ストレートSQLは、おそらくあなたの最善の策である:

def self.up 
    execute(%Q{ 
     UPDATE table 
     SET permissions = permissions | bit_C 
     WHERE permissions & bits_A_and_B <> 0 
    }) 
end 

はただ単に権限Aのためのビットを有するビットマップで許可Cセットとbits_A_and_Bのビットを持って適切なビットマップでbit_Cを交換してくださいBセット(両方とも)。 bit operators for PostgreSQLは、C言語の場合とほとんど同じです(ビット単位のXORは例外です)。ビットマップに整数の代わりにbitstringsを使用している場合も同様です。

関連する問題