2009-09-25 7 views
1

J'essaie de créer une page où les utilisateurs peuvent choisir de voter pour certains éléments dans l'ordre qu'ils ont choisi.Valider plusieurs sélections pour le vote par préférence dans Rails

Il existe une quantité dynamique d'options à choisir, par ex. il peut y avoir trois options à choisir parmi [pommes, bananes, oranges], et donc chaque option a un select contre elle, chaque sélection ayant alors trois valeurs d'ordre de préférence [1,2,3].

L'ensemble des résultats pourrait être quelque chose comme:

[apples,2],[bananas,3],[oranges,1] 

Et je vais éventuellement manipuler cette sorte que je [oranges,apples,bananas] dans un tableau. Comment puis-je valider que toutes les options ont été choisies et qu'elles peuvent être considérées comme en ordre? Ai-je besoin de transmettre les données à travers une boucle qui les ordonne selon la préférence choisie, puis compte pour voir s'il y a une préférence manquante?

Ou est-ce qu'il me manque un plugin merveilleux qui fait déjà ça?

Répondre

2

Ceci fera la validation, et vérifie qu'il y a des votes précisément pour 1, 2, 3 et pas d'autres.

s = [[:apples,2],[:bananas,3],[:oranges,1]] 
s.map(&:last).sort == (1..3).to_a 

Pour obtenir le tableau trié, utilisez ceci:

s.sort{|a,b| a.last <=> b.last}.map(&:first) 

EDIT (explication): les premiers travaux de bloc en extrayant le deuxième élément de chaque tableau dans le tableau, puis vérifie qu'il est égal à la plage 1..3. Cela valide l'unicité et la présence de chaque élément. Pour l'utiliser pour valider dans les rails, vous aurez besoin d'un validateur personnalisé.

Pour le validateur personnalisé (saison au goût):

validate :valid_votes? 

def valid_votes? 
    unless votes.map(&:last).sort == (1..3).to_a 
    errors.add(:votes, 'are missing, duplicated or invalid') 
    end 
end 
+0

Cela semble assez intéressant, pourriez-vous expliquer un peu? Et comment pourrais-je valider en utilisant le code que vous avez mentionné? – Les

+0

Wow, merci Peter - c'est génial! Je suppose que je pourrais passer la longueur du tableau attendu en tant que paramètre à la validation? Le nombre d'options va probablement varier chaque fois que l'utilisateur a le choix. – Les

+0

Absolument, vous pouvez passer dans le paramètre (à chaque fois que vous voyez 3, remplacez par n). – Peter

Questions connexes