web-dev-qa-db-fra.com

Rails: valider l'unicité de deux colonnes (ensemble)

J'ai un modèle Release avec medium et country colonnes (entre autres). Il ne devrait pas y avoir releases qui partage des combinaisons identiques medium/country.

Comment pourrais-je écrire ceci en tant que validation Rails?

103
Jackson Cunningham

Vous pouvez utiliser une validation nicité avec l'option scope.

En outre, vous devez ajouter un index unique à la base de données pour empêcher les nouveaux enregistrements de passer les validations lors de la vérification en même temps avant l'écriture:

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
175
tompave

Toutes les réponses ci-dessus manquent pour valider le caractère unique de plusieurs attributs dans un modèle. Le code ci-dessous vise à expliquer comment utiliser plusieurs attributs dans une étendue.

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

Il valide l'unicité de country dans toutes les lignes avec les valeurs de medium et another_medium.

Remarque: N'oubliez pas d'ajouter un index sur la colonne ci-dessus, cela assure une récupération rapide et ajoute une validation au niveau de la base de données pour les enregistrements uniques.

49
Aamir

Vous pouvez passer un paramètre :scope à votre validateur comme ceci:

validates_uniqueness_of :medium, scope: :country

Voir le documentation pour plus d'exemples.

31
K M Rakibul Islam