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?
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
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.
Vous pouvez passer un paramètre :scope
à votre validateur comme ceci:
validates_uniqueness_of :medium, scope: :country
Voir le documentation pour plus d'exemples.