Ruby - 循环检查是否至少填充了一对值

时间:2015-06-24 16:19:26

标签: ruby-on-rails ruby

所以在我的rails表格中有几行2个文本字段。对于要保存的表单,至少需要填写一个文本字段。

所以

nil   nil
10    20
nil   nil
nil   nil

有效。

此:

nil   nil
nil   nil
nil   nil
nil   nil

无效

此:

nil   10
nil   nil
nil   nil
nil   nil

无效

以下是我用来检查所有字段的方法(请注意,single_field和aggregate_field是字符串,是字段名称):

def no_values_present?(single_field, aggregate_field)
    self.lo_item.lo_line_items.each do |item|
    return false if "!item.#{single_field}".nil? && "!item.#{aggregate_field}".nil?
    end
    true
  end

但是我想这不起作用,因为它会多次返回true或false,并且即使前一行可能有效,也会确定行无效。

我需要整体的真假。

如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

尝试利用setTimeout(1)模块中的any?none?

您的代码可以重写为

Enumerable

虽然我认为条件是肯定的更清楚,并且在找到匹配时返回def no_values_present?(single_field, aggregate_field) self.lo_item.lo_line_items.none? { |item| !(item.send(single_field).nil?) && !(item.send(aggregate_field).nil?) } end 。我会写

true

请注意,def any_pairs_present?(single_field, aggregate_field) self.lo_item.lo_line_items.any? { |item| !(item.send(single_field).nil?) && !(item.send(aggregate_field).nil?) } end 永远不会是"!item.#{single_field}",因为它始终是一个字符串!如果您想动态访问实例字段,那么使用nil的方法就是这样做,但对于其他选项,您可以查看here,其中建议sendinstance_eval的替代方案

答案 1 :(得分:0)

该函数看起来没问题,但似乎存在语法错误,我还做了一些修改:

def form_valid?(single_field, aggregate_field)
    self.lo_item.lo_line_items.each do |item|
      return true if !item.send(single_field).nil? && !item.send(aggregate_field)
    end
    false
  end