PostgreSQLにはenumerated typesのコンセプトがデータベースに組み込まれています。Rails 3のPostgresデータベースでenumを使用するには?
Rails 3で列挙型を使用する列を持つ表を実装するにはどうすればよいですか?あなたは何とかPostgreSQLでenumを定義する必要がありますか?これを行うDB移行をどのように作成できますか?
Working in Rails 3.07、Ruby 1.92p180、PostgreSQL 8.3。
PostgreSQLにはenumerated typesのコンセプトがデータベースに組み込まれています。Rails 3のPostgresデータベースでenumを使用するには?
Rails 3で列挙型を使用する列を持つ表を実装するにはどうすればよいですか?あなたは何とかPostgreSQLでenumを定義する必要がありますか?これを行うDB移行をどのように作成できますか?
Working in Rails 3.07、Ruby 1.92p180、PostgreSQL 8.3。
レールは、ENUM
のデータ型をサポートしていません。これは、すべてのデータベースがそのデータ型をサポートしているわけではないためです。 ENUM
の値を扱う一般的な方法は、データベース(あなたの場合はPostgreSQL)に列挙型列を手動で作成し、それをRailsアプリケーションのstring
列として扱うことです。次に、validates_inclusion_ofバリデータを使用して、許可された値の使用を強制します。
validates_inclusion_of :gender, :in => [ "male", "female" ]
そして、enumフィールドを追加するには、移行のネイティブSQLを使用します。
class AddEnumType < ActiveRecord::Migration
def up
execute ".." # your native PostgreSQL queries to add the ENUM field
end
end
編集(2014年6月)
のRails 4.1今supports enums。 validates_inclusion_of
は今に変更することができます:
enum gender: [ :male, :female ]
(ただし、これはまだネイティブ基礎となるデータベースでサポートされていないので、ネイティブSQLの移行がまだ必要とされている。)
また、使用するスキーマを設定することができます.rbファイルの代わりに未処理のSQLを使用します。単純に汎用データストアとして使用するのではなく、データベースのより高度な機能(列挙型、全文検索、トリガ、関数など)を活用している場合、これはあなたの人生を楽にします。
はちょうどあなたのconfig/application.rb# Use SQL for the schema due to many database specific settings
config.active_record.schema_format = :sql
にこのラインを設定しそれを出力あなたのためにその問題を解決するstructure.sqlファイルをでしょう。 Railsの4のための上記の回答に加えて
、(そしておそらく3.2)を使用すると、「無効なOID」タイプの警告を避けるために、この操作を行うことができます。
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID.alias_type 'my_enum_type', 'text'
照会、あなたはまた、文字列を変換することになるでしょう
class ActiveRecord::ConnectionAdapters::Column
private
def simplified_type_with_my_enum_type(field_type)
if field_type == 'my_enum_type'
field_type.to_sym
else
simplified_type_without_my_enum_type(field_type)
end
end
alias_method_chain :simplified_type, :my_enum_type
end
非常に興味深い。さらに、ActiveRecordが ':: my_enum'キャストを特定の定数に自動的に追加する方法があるのはすばらしいことです。 – rewritten
@rewrittenレールが自動的に変換されるようにすることもできます。ポイントタイプを参照してください(https://github.com/rails/rails/pull/7324)。私が助けてくれることを嬉しく思います(マスターにするためにschema.rbサポートが必要です)。 – glebm
私はそれが特定の型のためだと思います。任意のユーザー定義型または列挙型を管理するコードをいくつか用意していますか?ツイッターでこれを続けて、ちょうどあなたに続きました... – rewritten
何exac:あなたのタイプに、たとえば
のためにあなたはまた、列パーサにパッチを適用したいと思いますPostgreSQLでこの列挙型をマイグレーションによって追加したり、後でそれを使用したりするのを防ぎますか? – plang