Railsでは、どのように私は最後の6ヶ月の範囲を持つvalidates_uniqueness_of:フィールドを

ruby-on-rails validation

*最初のアイテム*データベースに保存する前に、フィールドが(過去6か月以内に)一意であることを確認します。

私は私がvalidates_uniqueness_ofを使用する必要があると思っています:フィールド、case_sensitive ⇒ false、スコープ⇒ …​

私のアプリケーションでは、6か月前に使用されていた場合にのみ一意である必要があります。

それをcreated_atと比較することを考えていますが、実際にどうすればよいかわかりません。

  • 2番目の項目*誤って使用している可能性のあるテキストの前後にあるスペースを削除するには、どういうわけか.stripを使用する必要があると思います(これらの余分なスペースはデフォルトでレールに使用されます。一意のファイル)

誰かがこれがどのように正しく行われるべきかについてのヒントを持っているなら、私は本当にそれを感謝するでしょう。

  4  1


ベストアンサー

`+ validates_uniqueness_of `は、指定されたスコープ内の指定されたフィールドと同じ値を持つレコードが既に存在するかどうかをチェックすることで機能します。 `:scope `を使用すると、一意性の範囲を(明らかに)定義できます。たとえば、ブログソフトウェアを作成していて、ブログごとに1回だけ投稿タイトルを使用できるようにしたい場合は、「 validates_uniqueness_of:title、:scope ⇒:blog_id + `-スコープなしで言うことができますシステム全体で各タイトルを1回使用できるようにします。 `+:scope +`は、あなたが望むような複雑なチェックをさせません。

おそらくあなたがする必要があるのは、与えられた時間枠内で問題のフィールドの一意性をチェックするためのあなた自身の検証関数を作成することです(コードはモデルの範囲内に入ります):

validate :field_must_be_unique_within_six_months

def field_must_be_unique_within_six_months
  return if field.blank?
  num_duplicates = self.class.count(:conditions => ["field = ? AND created_at < ?", self.field, 6.months.ago])
  if num_duplicates > 0
    errors.add(:field, :taken)
  end
end

`+ field_must_be_unique_within_six_months `メソッドは ` validates_uniqueness_of `と同様に機能します。同じ指定されたフィールドを持つレコードが既にある場合にエラーメッセージを追加しますが、日付もチェックするという追加の条件があります。 ` validate:field_must_be_unique_within_six_months +`は、レコードが保存されるときに検証プロセスにメソッドを追加します。

DRYに違反せずに複数のフィールドを同時に検証するには、http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002104[validates_each]を使用して次のようなことを実行できます。

validates_each :field1, :field2 do |record, attr, value|
  if record.class.exists?(["#{attr.to_s} = ? AND created_at < ?", value, 6.months.ago])
    errors.add(attr, :taken)
  end
end

上記のブロックでは、「+ record 」は検証中のレコード、「 attr 」は属性(つまり「 field1 」、「 field2 」など)、「 value +」はその属性の値です。

10


あなたはおそらくこのようなことをすることができます:

is_used_recentlyの場合は、errors.add(:field、 'blah blah')を検証します。 終わり

def has_unique_field? Model.exists?(['field =? そしてcreated_at>? '、self.field、6.months.ago])end

def is_used_recently self.created_at <6.months.ago || self.new? #この時点でcreated_atが設定されるかどうかわかりません

あるいは、新しい検証ハンドラを作成するか、または既存のものを拡張して:withinオプションを渡すことをお勧めします。

先頭と末尾の空白を取り除くために必要な方法は ‘strip’です。 あなたはすべての分野でこれを実行することができます。

before_validation:clean_up_whitespace

def clean_up_whitespace self.some_field.strip! #これでストリップは適切に終了しました

これが助けになることを願っています、私がミスをしたかどうか私に知らせてください!

3


タイトルとURLをコピーしました