我的模型名为Item
,字段为:
发货(布尔),达到(布尔值),发货日期(日期)和达到日期(日期)。
视图中的已装货和已到达字段是复选框。
现在,当我在Item
模型中添加新记录时,如果shipped_at
和{{reached_at
,我希望shipped
日期字段和reached
日期字段为零1}}未选中复选框。如果只选择了其中一个,我希望存储该特定日期。
为了实现这一点,我在我的模型中创建了before_save过滤器:
class Item < ActiveRecord::Base
before_save :dates_defaults
def dates_defaults
if(shipped = 0 || reached = 0)
self.shipped_at = nil || self.reached_at = nil
end
end
end
如果未勾选复选框,则此工作正常。但是当它们存在时,日期字段仍为零。
我是否需要在dates_defaults
方法中添加else语句?如果有,怎么样?这是检查布尔字段的好方法吗? (我知道有些数据库将它们存储为0和1,有些数据库存储为T和F)。
还有一些'rails style'解决方案吗?
谢谢。
答案 0 :(得分:1)
首先if (shipped = 0 || reached = 0)
正在使用作业=
而不是比较==
所以发货总是零,因为发货(0)是&#34; truthy&#34;条件的后半部分被忽略了。
其次,self.shipped_at = nil || self.reached_at = nil
将始终设置为nil。同样,你没有使用比较==
,因为第一部分是零,所以第二部分总是被执行。
更好的解决方案可能是......
class Item < ActiveRecord::Base
before_save :dates_defaults
def dates_defaults
self.shipped_at = nil unless shipped?
self.reached_at = nil unless reached?
end
end
如果发货和到达是布尔值,您自动发货?到达了吗?方法