MySql上的Rails复选框存储为null或者零
时间:2020-03-06 14:38:36 来源:igfitidea点击:
在我的Rails应用程序中,我有一个项目列表(如任务列表),每个项目都有几个复选框来设置参数。
当我提交表单时,复选框在DB上存储为零,而未选中的存储为null。
问题是:是否可以配置它?要将数据存储在更传统的0或者1上,因为我认为将null存储为false并将0存储为true有点令人困惑,特别是如果另一个应用程序(例如C应用程序)需要读取数据时。
解决方案
造成这种情况的原因有很多:
- 确保迁移中数据库中的列的类型为"布尔值"
- 将默认值设置为布尔值
- 在表单上使用" check_box",而不是" check_box_tag"
- 某些版本的Rails在生成的脚手架上具有此行为,我认为设置默认值可以解决此问题,但我不太记得。
假设我们正在使用的属性是" club_member",如"我们是否是club_member?"中所述。
注意在Ruby / Rails中,它的工作方式,如果if model.club_member不被检查(值是null,或者在Ruby中为nil),则返回false;如果被检查(value为0),则返回true。
总体而言,我强烈建议我们不要让其他应用程序(如C应用程序)直接访问数据,而应该在Ruby / Rails中构建API,以将应用程序中的数据公开给外部实体。通过这种方式,我们将更好地封装应用程序的内部结构,而不必担心此类事情。
但是,话虽如此,这是答案:
使用:
value="1"
...在复选框HTML标签中添加属性,并将布尔属性的默认值(在迁移中)设置为0。
关于什么:
value.to_i.zero?
>> a=nil => nil >> a.to_i.zero? => true >> a=0 => 0 >> a.to_i.zero? => true >> a=3 => 3 >> a.to_i.zero? => false
从rails文档中:
如果对象为假,空或者空白字符串,则该对象为空。例如,,,nil,[]和{}为空白。
这简化了:
如果!address.nil? &&!address.empty?
到:
如果!address.blank?

