2017-09-28 5 views
0

railscastsのチュートリアル189 Embedded Associationに従ってアプリケーションをセットアップします。だから、roles_maskはどのようにレールで動作するのですか

class User < ApplicationRecord 

    ROLES = %w[admin moderator author] 

    def roles= (roles) 
     self.roles_mask = (roles & ROLES).map { |r| 2** ROLES.index(r) }.sum 
    end 

    def roles 
     ROLES.reject { |r| ((roles_mask || 0) & 2** ROLES.index(r)).zero? } 
    end 

    def role_symbols 
     roles.map(& :to_sym) 
    end 
end 

私のモデルに私は私のusersテーブルに

t.Integer :roles_mask 

を追加したチュートリアルと、次のようにすべてがフォームを使用して役割の追加や削除うまく動作します。しかし、私はどのようにコンソールからこれを達成できますか?それがどのくらい正確に機能するのですか?レールが整数値から文字列の役割を識別する方法は?

答えて

2

アハ!私の好きな論理!それはbitsの魔法です。機械語では、すべてが0と1で表されます(0-1)。今戻るロールに戻る

ROLES = %w[admin moderator author] 

モデルで指定された各ロールについて、1ビットが割り当てられます。ユーザーインスタンスの場合

admin moderator author 
1  1   1 

あなたは彼にその役割を与えた場合、そのビットは他の10になります。

だから、
u = User.new 
u.roles = [:admin] 
u.admin? #=> true 
u.roles_mask #=> 1 
admin moderator author 
1  0   0 
# Read it in reverse as 0 0 1 which in binary means 1. That's why roles_mask is 1 
u.roles << :author 
u.roles_mask #=> 5 
admin moderator author 
1  0   1 
# Read it as 1 0 1 which in binary means 5. That's why roles_mask is 5 

、それだけの役割の割り当てを維持魔法と他には何ビットだ:)変換here

2進数から10進数への詳細を読むあなたはrole_model宝石のREADMEが表示された場合、それは言及:

#有効な役割を宣言してください - 後で
#個の役割を追加した場合は、順序を変更しないでください。

これは言及された非常に季節です。注文を変更した場合、永続的な値が1のユーザーは、あなたが行ったことを知りません!

関連する問題