50 votes

Comment valider l'unicité d'une paire d'identifiants dans Ruby on Rails?

Supposons que la suite de DB migration en Ruby:

 create_table :question_votes do |t|
 t.integer :user_id
 t.integer :question_id
 t.integer :vote

t.les horodatages
fin

Supposons, en outre, que je souhaite que les lignes de la DB contenir unique (user_id, question_id) paires. Qu'est-ce que le droit de la poussière de mettre dans le modèle pour le réaliser?

validates_uniqueness_of :user_id, :question_id
semble tout simplement faire des lignes uniques par id d'utilisateur, et unique par id de question, au lieu de l'unique par le couple.

91voto

Demi Points 3547
 validates_uniqueness_of :user_id, :scope => [:question_id]
 

si vous aviez besoin d'inclure une autre colonne (ou plus), vous pouvez également l'ajouter à la portée. Exemple:

 validates_uniqueness_of :user_id, :scope => [:question_id, :some_third_column]
 

25voto

pakeha Points 1207

Si vous utilisez mysql, vous pouvez le faire dans la base de données en utilisant un index unique. C'est quelque chose comme:

 add_index :question_votes, [:question_id, :user_id], :unique => true
 

Cela va déclencher une exception lorsque vous essayez de sauvegarder une combinaison doublée de question_id / user_id, vous devrez donc expérimenter et déterminer quelle exception à attraper et à gérer.

15voto

Jonathan Lin Points 2498

De RailsGuides . validates fonctionne aussi:

 class QuestionVote < ActiveRecord::Base
  validates :user_id, :uniqueness => { :scope => :question_id }
end
 

10voto

eggdrop Points 1035

Sauf pour la rédaction de votre propre méthode de validation, le meilleur que vous pouvez faire avec validates_uniqueness_of est-ce:

validates_uniqueness_of :user_id, :scope => "question_id"

Cela permettra de vérifier que le user_id est unique dans toutes les lignes avec le même question_id que l'enregistrement que vous tentez d'insérer.

Mais ce n'est pas ce que vous voulez.

Je crois que vous êtes à la recherche de la combinaison de l' :user_id et :question_id être unique dans la base de données.

Dans ce cas, vous devez faire deux choses:

  1. Écrivez votre propre méthode de validation.
  2. Créer une contrainte dans la base de données parce qu'il y a encore une chance que l' votre application va traiter les deux registres à même temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X