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?