これは古い質問だと思いますが、それでもグーグルでトップヒットなので、宝石としてパッケージ化されたソリューションを共有したいと思いました。https://github.com/blackrat/acts_as_enumerationを
ご覧ください
READMEから:
したがって、データベーステーブルに「name」という列がある場合は、次のように宣言します。
Acts_as_enumeration:name
その列のすべてのアイテムを選択し、それらをハッシュで主キー値にマップします。
さらに、インスタンスメソッドis _#{key}を作成します。ここで、keyはその列のすべての値であり、is?(array)およびis_not?(array)は、その配列内の型をチェックします。
列の例としてnameを保持すると、クラスメソッドid_for_nameはそのマッピングの主キー値を返し、valid_name?(value)は、テーブルにその値を持つname列のエントリが含まれているかどうかを示します。
最後に、欠落しているメソッドは、is_paul_or_michael_or_luke?などのメソッドのis_およびis_notチェーンを可能にします。これは(is_paul?|| is_michael?|| is_luke?)またはis?(:paul、:michael、:luke)およびis_not_paul_or_michael_or_likeと同じ効果があり、!(is_paul || is_michael?|| is_luke? )または!is?(:paul、:michael、:luke)
警告:method_missingが使用するメカニズムにより、誰かが実際に「not bruce」という名前を持っていた場合、組み合わせクエリはこれを最初の要素として使用できません。つまり、「ブルースではない」だけでなく、「ではない」。
では、is_not_bruce_or_paulの組み合わせですか?is_paul_or_not_bruceと書く必要がありますか?望ましい効果をもたらすために。is_not_not_bruce_or_paulは問題ありませんが、これが発生する可能性は、モンティパイソンのスケッチの外で実際に「ブルースではない」と呼ばれる人とほぼ同じです。
(これはおそらくそうなることを意味するので、新しいエントリをサポートするようにコードを変更する前に、順序を変更してみてください)