2013-05-24 16 views
5

yinelenen kayıtları önlemek: Benim denetleyicisi olarakDoğru yolu Bunu alabilir benim modelde Raylar

validates :name, :presence => true, :uniqueness => true 

Ben: başarıyla rekor oluşturur

... 
if @location.save 
    format.html { redirect_to @location, :notice => 'Location was successfully created.' } 
    format.json { render :json => @location, :status => :created } 
... 

zaten yoksa Bu isimle tabloyu kaydedin. DB kısıtlamalarına güvenmek yerine olası bir kopya kaydı eklemeden önce kontrol etmenin iyi bir uygulama olduğunu düşünüyorum.

Denetlemek için denetleyiciye bir şey eklemeliyim? Bunu yapmanın doğru yolu nedir?

Çok teşekkürler.

cevap

6

Kayıtlar veritabanına vurmadan önce doğrulamalar Rails tarafından yapılır. Kayıt bir doğrulamada başarısız olursa, kaydedilmez ve .save, false'u döndürür; bu, denetleyicinizin else yan tümcesinin yürütülmesine neden olur. Bu fıkra genellikle gönderilen sayfayı yeniden görüntüler ve hataların düzeltilmesini sağlar.

Denetleyicinizin bu şekilde oluşturulduğunu varsayarsak, başka bir şey yapmanız gerekmez. Doğal olarak, tüm veritabanı kısıtlamalarının doğrulamalarınızda yansıtıldığından emin olmalısınız, aksi halde bir kayıt doğrulamaları iletebilir ancak kaydedildiği zaman bir kısıtlamayı ihlal eden bir hata üretebilir.

5

Denetleyicide hiçbir şey yapmanıza gerek yoktur.

The correct way to prevent duplicate records in Rails is used 
validation in model which you did correctly. 
2

Rails'de benzersizliği doğrulamanın doğru yoluna sahipsiniz ve bu doğrulama yoluyla. Bunu denetleyicide kontrol etmeniz gerekmez, çünkü doğrulama sizin için geçerli olur.

Benzersiz bir doğrulama sağlamanın, db'de benzersiz bir kayda sahip olacağınızı garanti etmediğini unutmayın. Bu, api'de validates_uniqueness_of documentation'da açıklanmaktadır.

6

Veritabanınıza benzersiz bir dizin ekleyin. Bu şekilde, eğer bir şey model geçerliliğinden geçerse (nadir, fakat teknik olarak mümkün), veritabanına kaydedilecek sorgu başarısız olur.

4

Doğrulama doğru. Yukarıdaki tüm diğer cevaplarda olduğu gibi, örneğin birden fazla alanı doğrulamak istediğiniz varsayılırsa, örneğin bir istek listeniz varsa, bu user_id ve item_id'u alır, bu tür bir senaryo için bir kullanıcı tarafından yalnızca bir kez eklenecek öğelere ihtiyacınız vardır `doğrular

Class class_name < ActiveRecord::Base 
    validates_uniqueness_of :item_id, scope: :user_id 
end 
+0

Eğer kullanabileceğiniz modeline doğrulama bu tür ekleyin: ITEM_ID, tekliği: ilgili: {kapsamını: user_id}' http://www.rubydoc.info/github/bbatsov/rubocop/Rubocop/Cop/Raylar/Doğrulama – Math