2016-04-01 1 views
0

私はテーブルの列にデータを入力するために使用しているbefore_create関数を持っています。例えば before_createについて:generate_numberレールで作成する前のカスタム検証

def generate_number 

    end 

私は条件に基づいて、その人口の前の列の一意性を確認したいです。

例:番号がデータベース2年に作成されている場合前、私はそれ私はそれのためにカスタム検証を作成することができる方法

に適用される一意性の検証をしたいいけません。そして私はどこにそれを含めるべきですか?

あなたが検証にロジックを適用する unlessまたは ifを使用することができます

答えて

0

:あなたが指定したので

validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago } 

これはあなたのbefore_create

class User < ActiveRecord::Base 
    #... 

    validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago } 
end 
+0

この場合、検証に問題がなければ名前を空白にしますか? –

0

と同じように、あなたのActiveRecordのモデルに行くだろうまだデータベースに登録されていない数字が生成されるまで、数字を生成し続けるコメントを入力してください:

def generate_number 
    begin 
    value = generate 
    end while created_at < 2.years.ago && Table.exists?(column: value) 
    self.column = value 
end 

def generate 
    ... # Code to generate number here 
end 

これはループを続行しますwhile created_at列は2年前より早く、生成された番号はデータベースにあります。私は、generateがチェックされる前に少なくとも1回は実行されるように、whileを最下部に条件を付けました。

私はまだcreated_at条件の目的を理解していません。どのように動作させるべきかを指定したい場合は、その部分を変更できます。それ以外の場合は、実際の問題の一部ではなく、例として考えてみましょう。

+0

はい私はそれを作成してからランダムな関数を再度呼び出すことを防ぎ、検証が成立しなければ異なる数が生成されるようにしたい –

+0

申し訳ありませんが、データベースにはまだありません。 – MTarantini