我需要为投票偏好顺序验证一组选择输入。这次我不得不稍微改变一下。
用户的选项如下:
按优先顺序选择
1:[选择选项]
2:[选择选项]
3:[选择选项]
这会产生的哈希值如下:
[“1”=> “option-3”,“2”=> “option-1”,“3”=> “0”]
0是无选择的选择。
我有两个问题:
如何验证所选选项的唯一存在 - 因此不能有多个“option-2”,但可能有多个“0”(没有首选项)?
我如何验证以确保如果有人为第二个选择选择0,则他们在第三个选择中没有选项(因此使用如下数据:[“1”=>“选项 - 3“,”2“=>”0“,”3“=>”选项-1“])?
我一直在尝试各种各样的数组操作,但无法完成它。
答案 0 :(得分:0)
我会做这样的事情:
valid = true
votes = (1..3).map{|x| params["select#{x}"]}
# Pass first condition
valid = false unless votes.uniq.length == votes.length
# Pass second condition
previous_is_zero = false
votes.each do |x|
unless x == 0
if previous_is_zero == true
valid = false
break
else
previous_is_zero = true
end
end
答案 1 :(得分:0)
这听起来像是this railscast中所见的虚拟属性和嵌套表单的工作。
假设您的表单适用于具有多个投票的Ballot模型,您应该可以执行以下操作:
<%= form_for @ballot do %>
Choose in order of preference:
<% for votes in @ballot.votes %>
<% fields_for "ballot[votes][]", vote do |vote_form| %>
<%= vote_form.collection_select(:choice, vote.choices, :id %>
<% end %>
<% end %>
<% end %>
如果所有内容都是有效记录,您可以通过Ballot has_many :votes, :through => :castings, :uniq => true
或Casting validates_uniqueness_of
使用它来建立唯一性。如果不是,我会使用select
而不是collection_select
,然后您可以通过#uniq
中的Ballot#votes=
删除重复项。
希望这足以让你入门。完整实施将根据您当前数据模型的规范化程度而有所不同。