在我的项目中,我有一个包含四个服装的模型:名称,描述,内容和完成。
我想在保存之前检查所有属性(除已完成外是否为空白)。如果不为空,则将完成设置为1,否则设置为0。
我使用ActiveRecord和Mysql,因此它也将具有id,created_at和Updated_at列。
我写了一个before_save回调,像这样:
def check_completed
if self.attributes.except("id", "created_at", "updated_at").all? {|k, v| v.present?}
self.completed = 1
else
self.completed = 0
end
end
它可以工作,但是看起来很丑。我想删除除外函数调用。
有没有更好的方法可以做到这一点?
我假设使用了.except方法,因为id,created_at和updated_at都是由MySQL内部生成和管理的。因此,该列表扩展或更改是不寻常的。我同意所提供的代码是好的。如果要完全缩短它,可以使用三元形式,如下所示:
def check_completed
self.attributes.except("id", "created_at", "updated_at").all? {|k, v| v.present?} ? 1 : 0
end
消除.except方法可使您在模型更改时随时使用此方法。
扩展讨论:我很好奇您希望返回1或0?没有看到更多代码,我不确定您的意图。但是,如果“之前”回调返回false,则执行将停止并且事务将回滚。在任何其他情况下,执行将继续。在Ruby中,0不为假。False只能由false或nil触发。我的期望是,它更有可能使用true代替1并使用false代替0?如果是这样,代码将是:
def check_completed
self.attributes.except("id", "created_at", "updated_at").all? {|k, v| v.present?} ? true : false
end
这样,如果不存在任何用户属性,则交易将被取消并回滚。但是,这取决于您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句