2011-11-10 6 views
10

フィールドの値を制限したい。したがって、列の値は指定された値のセットでなければなりません。移行/モデルを使用することは可能ですか?または、私はDBで手動で行う必要がありますか?列の値を制限する方法

答えて

24

あなたは、このための検証を使用しますa whole Rails guide on the topicがあります特定:ここ

あなたはかなりのレールのバリデータは何ができるかに比べて限定されているデータベース(でそれを行う場合は、使用したいかもしれないものです。 2015

class Person < ActiveRecord::Base 
    validates :relationship_status, 
    :inclusion => { :in => [ 'Single', 'Married', 'Divorced', 'Other' ], 
    :message => "%{value} is not a valid relationship status" } 
end 

編集8月:のRails 4.1の時点で、あなたはこのためenumクラスのメソッドを使用することができますそれはあなたの列があることを必要としますが、この場合には探しているヘルパーは、例えば、:inclusionです。整数型:

class Person < ActiveRecord::Base 
    enum relationship_status: [ :single, :married, :divorced, :other ] 
end 

それは自動的にあまりにも、あなたのためにいくつかの便利なメソッドを定義します。

p = Person.new(relationship_status: :married) 

p.married? # => true 
p.single? # => false 

p.single! 
p.single? # => true 

あなたがここにenumのドキュメントを読むことができます:http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html

+0

移行レベルで設定することはできますか? – damluar

+2

データベースレベルで制約を設定することができます。たとえば、MySQLとPostgreSQLのカラムタイプは「ENUM」ですが、SQLiteとOracleはそうではありませんが、Railsでは直接サポートしていません。たとえば、サポートされていない列タイプを使用できます。 't.column:col_name、 'CUSTOM SQL TYPE''ですが、それらの値のカスタム処理が多くなり、別のRDBMSでこれらのマイグレーションを実行することができなくなります。他の人)は、ドキュメントがそれに対して特に警告します。 –

+0

ありがとう、仲間。あなたはたくさんの助けになりました! – damluar

2

必要な信頼度によって異なります。モデルにバリデーターを追加してその値に制限するだけで、既存のデータが一致していることを確認することはできません(また、バリデーションのために後続の保存が失敗する可能性があります)。また、他のアプリケーション/それを回避するraw SQL

絶対的な信頼を得たい場合は、データベースを使用してください。 http://www.w3schools.com/sql/sql_check.asp

+0

おかげで、はい、私は検証について知っています。マイグレーションファイルに自分の制限を指定することはできますか? – damluar

+1

一致していないものを見つけて更新/削除する移行を作成することができます。ただし、マイグレーションでモデルを使用すると、マイグレーションが期待しているモデルとモデルの同期が外れていると、人を動かす可能性があります。 – Ponny

+0

助けてくれてありがとう! – damluar

関連する問題