Rails检查模型以查看是否所有字段都为空

时间:2014-09-11 22:16:56

标签: ruby-on-rails ruby oop model helper

就我测试过而言,这个辅助方法的工作原理完全如此,但我想知道是否有更简单,内置或更智能的方法来运行此检查!我也知道在ApplicationHelper中使用它可能并不理想。不确定我是否应该将它放在父对象(检查),其他模型中,或保持原样。

使用is_model_empty?我需要遍历11个不同(但相似)模型中的任何一个的每个字段,以检查它们是否都是空的。所有这些除了:id,:inspection_id,:created_at和:updated_at字段,它们永远不会是空白的。空可以是零,可以是[],也可以是['']。空字符串实际上意味着用户输入的内容不会包含在内。值可以是字符串或数组,因此.empty?无法工作。

def is_model_empty?(model)
    model.attributes.each do |k, v|
        unless ['id', 'inspection_id', 'created_at', 'updated_at'].include?(k)
            return false unless v.nil? || v == [] || v == [""]
        end
    end
    true
end

11个模型都属于检验,每个模型都有has_one关系:

has_one :first_info_section
has_one :second_info_section
has_one :third_info_section

非常感谢任何建议/反馈。谢谢你的阅读!

-Dave

3 个答案:

答案 0 :(得分:3)

您的方法可以简化为每个模型的实例方法。如果所有模型的属性异常相同,则可以创建共享库并将其包含在每个模型中。

app/models/empty_detection.rb

module EmptyDetection
  def empty?
    attributes.all? do |k, v|
      ['id', 'inspection_id', 'created_at', 'updated_at'].include?(k) || v.nil? || v == [] || v == [""]
    end
  end
end

在每个模型中包含您希望能够检查空条件的模块。例如,Widget模型:

class Widget < ActiveRecord::Base
  include EmptyDetection
end

现在,您可以在Widget的任何实例上使用它:

widget = Widget.find(45)
widget.empty?

答案 1 :(得分:1)

这是一个非常基本的重构:

def is_empty?(model)
  whitelist = %w[ id inspection_id created_at updated_at ]

  model.attributes.all? do |attr, val|
    whitelist.exclude?(attr) || val.nil? || val == [] || val == [""]
  end
end

你真正想要的是一个验证器,在Active Record Validations Rails Guide中描述:

在这种情况下,它看起来像这样:

class EmptyValidator < ActiveModel::Validator
  WHITELIST = %w[ id inspection_id created_at updated_at ].freeze

  def validate(record)
    return unless model.attributes.all? do |attr, val|
      WHITELIST.exclude?(attr) || empty?(val)
    end
    record.errors[:base] << "You missed one!"
  end

  private
  def empty?(val)
    val.nil? || val == [] || val == [""]
  end
end

然后,在每个模型中......

class MyModel < ActiveRecord::Base
  validates_with EmptyValidator
end

我希望这有用!

答案 2 :(得分:0)

@roles_accepted