Raylar: iki sütunun benzersizliğini doğrulayın (birlikte)


Yanıtlar:


230

Bu seçenekle bir benzersizlik doğrulaması kullanabilirsiniz scope.

Ayrıca, yeni kayıtların yazılmadan önce aynı anda kontrol edildiğinde doğrulamaları geçmesini önlemek için DB'ye benzersiz bir dizin eklemelisiniz:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end

Dizin için +1, uniquetanınmadığı için -1 . Bu kısım için aşağıdaki cevabı kullandım.
Aleks

7
Evet, üzgünüm, doğrulama anahtarı olmalı uniqueness, olmamalı unique. Bağlantılı belgelere bakın. Cevabı düzeltiyorum.
2016

1
Hm, güzel, teşekkürler :) Kendimi tekrarlamak - indeksi koymak, çözümü bir sonraki seviyeye getiriyor ve bu cevabı bulmadan önce karşılaştığım diğer "kodlama" çözümleri gibi değil. Bunun için +1
Aleks

70

Yukarıdaki yanıtların tümü, bir modeldeki birden çok özelliğin benzersizliğinin nasıl doğrulanacağı konusunda eksiktir. Aşağıdaki kod, bir kapsamda birden çok özniteliğin nasıl kullanılacağını anlatmayı amaçlamaktadır.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

Bu benzersizliği doğrular countrydeğerleri ile tüm satırlara mediumve another_medium.

Not: Yukarıdaki sütuna bir dizin eklemeyi unutmayın, bu hızlı erişimi garanti eder ve benzersiz kayıtlar için bir DB düzeyi doğrulaması ekler.

Güncelleme: Tablo oluştururken bir dizin eklemek için

t.index [:medium, :another_medium], unique: true

41

:scopeDoğrulayıcınıza aşağıdaki gibi bir parametre iletebilirsiniz :

validates_uniqueness_of :medium, scope: :country

Daha fazla örnek için belgelere bakın .


8
@DennisBest "Çalışıyor", ancak yarış koşullarına karşı koruma sağlamıyor. İki istemci eşzamanlı istekte bulunursa, diğeri doğrulanmadan önce veritabanına bağlı değilse ikisi de doğrulamayı geçebilir. Ayrıca, tompave'in cevabında olduğu gibi veritabanına özgü bir kısıtlamaya ihtiyacınız var.
çorba köpeği
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.