J'ai un Release
modèle avec medium
et des country
colonnes (entre autres). Il ne devrait pas y avoir de releases
part identiques medium
/ country
combinaisons.
Comment pourrais-je écrire cela comme une validation de rails?
J'ai un Release
modèle avec medium
et des country
colonnes (entre autres). Il ne devrait pas y avoir de releases
part identiques medium
/ country
combinaisons.
Comment pourrais-je écrire cela comme une validation de rails?
Réponses:
Vous pouvez utiliser une validation d' unicité avec l' scope
option.
De plus, vous devez ajouter un index unique à la base de données pour empêcher les nouveaux enregistrements de passer les validations lorsqu'ils sont vérifiés en même temps avant d'être écrits:
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
unique
car il n'est pas reconnu. Pour cette partie, j'ai utilisé la réponse ci-dessous.
uniqueness
, non unique
. Voir la documentation liée. Fixer la réponse.
Toutes les réponses ci-dessus ne permettent pas de valider l'unicité de plusieurs attributs dans un modèle. Le code ci-dessous a l'intention de dire comment utiliser plusieurs attributs dans une portée.
validates :country, uniqueness: { scope: [:medium, :another_medium] }
Il valide l'unicité de country
dans toutes les lignes avec des 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.
Mise à jour: pour ajouter un index lors de la création d'une table
t.index [:medium, :another_medium], unique: true
Vous pouvez passer un :scope
paramètre à votre validateur comme ceci:
validates_uniqueness_of :medium, scope: :country
Consultez la documentation pour plus d'exemples.