Contrainte d'unicité de Rails et index unique db correspondant pour la colonne null
J'ai le texte suivant dans mon fichier de migration
def self.up
create_table :payment_agreements do |t|
t.boolean :automatic, :default => true, :null => false
t.string :payment_trigger_on_order
t.references :supplier
t.references :seller
t.references :product
t.timestamps
end
end
Je veux m'assurer que, si un product_id est spécifiée, il est unique, mais je tiens également à autoriser les valeurs null et j'ai donc le suivant dans mon modèle:
validates :product_id,
:uniqueness => true,
:allow_nil => true
Fonctionne très bien mais je dois ajouter un index pour le fichier de migration
add_index :payment_agreements, :product_id, :unique => true
Évidemment, cela va lever une exception lorsque deux valeurs null sont insérées pour product_id. Je pourrais tout simplement omettre l'indice dans la migration, mais ensuite, il ya la chance que je vais obtenir en deux PaymentAgreements avec la même product_id comme indiqué ici: La simultanéité et de l'intégrité
Ma question est quel est le meilleur/la plus commune façon de traiter ce problème
source d'informationauteur Dave
Vous devez vous connecter pour publier un commentaire.
cela dépend de votre serveur de base de données.
comme pour mysql:
Certains grands systèmes de base de données ne permettent pas d'un index unique, contenir des valeurs Null: unique s'applique à des valeurs Null comme des non-valeurs Null. Il y a des façons de contourner cette sur le niveau de base de données (par exemple, les déclencheurs, ou une colonne calculée; voir texte du lien).
Vous pouvez résoudre ce au niveau de l'application et la mettre dans une validation qui vérifie l'unicité si le
product_id
n'est pas nulle.(Mise à jour: Comme l'a souligné zed_0xff, MySql permet à plusieurs valeurs Null dans un index UNIQUE dans le plus couramment utilisé des moteurs de stockage.)