2016-05-28 11 views
1

列(型文字列)に一意性を付与したいのですが、文字列の一部に問題があります。関数を使用してデータベースに挿入する前に、最初の部分を切り捨てています。before_save 。したがって、切り捨て/書式設定後も入力が同じであるにもかかわらず、入力がデータベースの内容と異なる可能性があるため、レールの一意性検証は機能しません。Rails - 一意性のカスタム検証

最初に文字列を切り捨てて、一意性を検証できるようにしたいのですが、レールを使用できるかどうかわかりませんvalidates uniqueness: true。私はカスタムvalidateを書くだけでいいですか?

答えて

2

Railsのコールバックの順序は次のとおりです。

( - ) - 有効

(1)before_validation

は()

を保存( - )(

を検証2)after_validation

before_save(3)(4)before_create

( - )(5)

を作成するには、

after_save

(6)after_create(7)

をafter_commit

詳細はhereです。したがって、単に次のようなことをしてください:

validates :your_data_field, uniqueness: true 
before_validation :normalize_data 

def normalize_data 
    # Normalize your data here 
end 

このように、記述したとおりに動作し、書き込みおよびカスタム検証は不要です。それはより美しくなります!

1

前述のとおり、カスタムバリデータを作成してvalidates_withを使用することをお勧めします。それについての情報はここにある:

http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_with

DRY原則に従うために、そしてまたあなたの切り捨てロジックへの変更は、あなたのバリデータとあなたのbefore_saveコールバックの両方に反映されていることを確認するために、私は切り捨てを返すメソッドを作成示唆しますそのバリデータとコールバック内で同じメソッドを使用します。

関連する問題