Rails中如何简洁检查ActiveRecord对象多个指定属性是否非空
Rails Model 指定属性非空校验的简洁实现
分两种常见场景给出符合Ruby/Rails开发风格的写法:
场景1:校验为模型通用规则
如果fname、lname非空是Person模型的全局要求,直接用Rails自带的验证辅助方法即可,写在模型定义中:
class Person < ApplicationRecord # 一行完成多属性非空校验,自动支持保存前拦截、错误信息回填等能力 validates :fname, :lname, presence: true end
使用时直接调用person.valid?就能拿到校验结果,校验失败的错误信息会自动存入person.errors对象中,无需手动写判断逻辑。
场景2:仅特定业务场景临时校验
如果不需要全局校验,只是某一处业务逻辑需要临时判断指定属性非空,可以用Array#all?批量处理,比链式写&&扩展性更强:
# 写法1:直接通过属性下标读取 %i[fname lname].all? { |attr| person[attr].present? } # 写法2:用public_send更稳妥,兼容属性为自定义方法的场景 %i[fname lname].all? { |attr| person.public_send(attr).present? }
如果需要定位具体是哪个属性为空,可以用Array#select过滤出缺失属性:
missing_attrs = %i[fname lname].select { |attr| person[attr].blank? } if missing_attrs.any? # 可直接拼接错误提示:"#{missing_attrs.join('、')}不能为空" end
如果这组属性的校验逻辑会多处复用,可以抽成模型的实例方法:
class Person < ApplicationRecord def required_name_attrs_present? %i[fname lname].all? { |attr| self[attr].present? } end end
后续直接调用person.required_name_attrs_present?即可,代码可读性更高。
内容的提问来源于stack exchange,提问作者Ahkshaey Ravi
相关产品推荐
相关产品推荐

