在Rails中验证多个选择以进行首选项投票

时间:2009-09-25 19:41:11

标签: ruby-on-rails ruby

我正在尝试创建一个页面,用户可以根据自己选择的顺序选择某些项目的投票。

有大量可供选择的选项,例如:可能有三个选项可供选择[苹果,香蕉,橙子],因此每个选项都有一个选择,每个选项都有三个优先顺序值[1,2,3]。

结果集可能类似于:

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

我最终会操纵这个,以便我在数组中有[oranges,apples,bananas]

如何验证是否已选择所有选项,并且可以看到它们是有序的?

我是否需要通过循环传递数据,该循环按所选择的首选项对其进行排序,然后计算是否缺少首选项?

或者我错过了一个已经完成此功能的精彩插件?

1 个答案:

答案 0 :(得分:2)

这将进行验证,并检查是否有精确1, 2, 3和其他人的投票。

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

要获取已排序的数组,请使用:

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

编辑(解释):第一个块通过提取数组中每个数组的第二个项来工作,然后检查它是否等于范围1..3。这验证了每个项目的唯一性和存在性。要使用它来验证rails,您需要一个自定义验证器。

对于自定义验证器(品尝季节):

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