Rails "validates_uniqueness_of" Büyük / Küçük Harfe Duyarlılık


96

İşte model (SQLLite3 kullanıyorum):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

Örneğin, sonra ben "Yale" ekleyemezsiniz ancak "Yale" add olabilir add "Yale." Doğrulama durumunu nasıl duyarsız hale getirebilirim?

DÜZENLEME: Bulundu - Aktif Kayıt Doğrulamaları

Yanıtlar:


232

validates_uniqueness_of :name, :case_sensitive => falsehile yapar, ancak birden fazla sunucunuz / sunucu işleminiz (örneğin Phusion Passenger çalıştıran, birden çok Mongrels, vb.) veya çok iş parçacıklı bir sunucunuz varsa validates_uniqueness_of, bunun benzersizliği garanti etmediğini aklınızda bulundurmalısınız . Bunun nedeni, şu olaylar dizisini alabilmenizdir (sıra önemlidir):

  1. İşlem A, 'foo' adında yeni bir kullanıcı oluşturma isteği alır
  2. Süreç B aynı şeyi yapar
  3. İşlem A, DB'ye bu adın henüz mevcut olup olmadığını ve DB'nin adın henüz mevcut olmadığını söyleyerek 'foo'nun benzersizliğini doğrular.
  4. Süreç B aynı şeyi yapıyor ve aynı yanıtı alıyor
  5. İşlem A insert, yeni kayıt için ifadeyi gönderir ve başarılı olur
  6. Bu alan için benzersizlik gerektiren bir veritabanı kısıtlamanız varsa, İşlem B insertyeni kayıt için ifadeyi gönderir ve SQL adaptöründen gelen çirkin bir sunucu istisnasıyla başarısız olur . Bir veritabanı kısıtlamanız yoksa, ekleme başarılı olur ve artık ad olarak 'foo' olan iki satırınız olur.

Ayrıca validates_uniqueness_ofRails belgelerinde "Eşzamanlılık ve bütünlük" konusuna bakın .

Gönderen Raylar 3rd Edition Ruby :

... ismine rağmen, validates_uniqueness_of sütun değerlerinin benzersiz olacağını garanti etmez. Yapabileceği tek şey, hiçbir sütunun, doğrulama gerçekleştirildiği sırada doğrulanmakta olan kayıttaki değerle aynı değere sahip olmadığını doğrulamaktır. Her biri benzersiz olması gereken bir sütun için aynı değere ve her iki kaydın da doğrulamayı geçmesi için aynı anda iki kaydın oluşturulması mümkündür. Benzersizliği sağlamanın en güvenilir yolu, veritabanı düzeyinde kısıtlamadır. "

Ayrıca bkz Bu programcının deneyimi ile validates_uniqueness_of.

Bunun yaygın olarak meydana gelmesinin bir yolu, yeni bir hesap oluştururken bir web sayfasından yanlışlıkla çift gönderim yapılmasıdır. Bu çözülmesi zor bir sorundur çünkü kullanıcının geri alacağı şey ikinci (çirkin) hatadır ve gerçekte başarılı olduğunda kayıtlarının başarısız olduğunu düşünmelerini sağlar. Bunu önlemek için bulduğum en iyi yol, yalnızca javascript kullanarak çift gönderimi engellemeye çalışmaktır.


4
Bir not olarak - işte db düzeyindeki kısıtlamaları kullanarak bu sorunu çözmeye çalışmak için Rails'e gönderdiğim bir yama: rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/…
Jordan Brough

ayrıca, çok yıllık "kullanıcı gönder düğmesini çift tıkladı" sorunu var, ancak bu daha çok şunu kullanarak bir düzeltme: disable_with
Ghoti

79

Raylarda 3 bunu modelinizde yapabilirsiniz:

validates :name, :uniqueness => true

veya case_sensitivity olmadan

validates :name, :uniqueness => {:case_sensitive => false}

Bu tam olarak istediğim şey.
Jigar Bhatt

2
10 yılı aşkın süredir Rails yapıyorum. Bu seçeneği yeni öğrendiğime inanamıyorum. Rails'de her zaman öğrenilecek yeni bir şeyler vardır ... kişinin beceri seviyesi ne olursa olsun.
danielricecodes

25

Büyük / küçük harf duyarlılığını belirleyebileceğiniz bir seçenek var

  validates_uniqueness_of :name, :case_sensitive => false

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.