Rails はENUM
型を提供していませんが、5 つの値しか受け入れられないデータ メンバーが必要です。さらに、Rails Forms Helper と自動的に統合したい: select_tag
.
私の状況の正しい解決策は何ですか?
PS、組み込みの適切なソリューションが存在する場合は、外部プラグインを使用したくありません。
Rails はENUM
型を提供していませんが、5 つの値しか受け入れられないデータ メンバーが必要です。さらに、Rails Forms Helper と自動的に統合したい: select_tag
.
私の状況の正しい解決策は何ですか?
PS、組み込みの適切なソリューションが存在する場合は、外部プラグインを使用したくありません。
このような機能は、できるだけ使用される場所の近くに置いています。
値が単一のモデルで使用される場合は、それらをモデルに保持してください。たとえば、ユーザーが特定の可能なタイプを持ち、それらのタイプのみを持っている場合、次のようになります。
class User < ActiveRecord::Base
TYPES = %w{guest, paid, admin}
# Plus validation on the `type` field.
# Maybe plus a setter override that also validates.
end
選択で許容される値など、他の場所でこれらの型を参照する必要がある場合:
User::TYPES
これに関しては、デコレーターを提供して「人間が読める」ようにする (大文字にする、間隔を空けるなど) ことや、次のようなことを可能にするメタプログラミング メソッドを提供することなど、多くの重要な調整があります。
user.is_guest? # Or...
user.make_guest! # Or...
user.guest!
私はこの機能のために独自の小さな gem を使用しています。これは、本格的な関連付けが多すぎて価値がないことがよくあるためです。次のようなことができます。
class User < ActiveRecord::Base
simple_enum :user_type, %w{guest, paid, admin}
end
Rails 4.1 には列挙型があります。ベータ版にアップグレードしたところ、魅力的に機能しています。
http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
私は active_enum gem を試しました。これは素晴らしいですが、Rails 4 とは互換性がありません。Paulo のソリューションはかなりうまく機能し、必要に応じて enum を懸念事項に抽出することもできますが、私にとっては重くなり始めたので、むしろアップグレードしました!
Enum を ApplicationHelper のヘルパーとして簡単に定義できます
class ApplicationHelper
def select_range
%w{"a", "b", "c", "d", "e"}
end
end
その後、ビューでselect_range
自由に呼び出すことができます。