就我测试过而言,这个辅助方法的工作原理完全如此,但我想知道是否有更简单,内置或更智能的方法来运行此检查!我也知道在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
答案 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