我正在使用Ruby Rails创建一个表单。它有一个复选框,当选中时表示该条目应该隐藏(true或bit 1。vs false/bit 0(,然而,当我提交复选框时,我收到一个错误:
Mysql2::Error: Data too long for column 'hidden_status' at row 1: INSERT INTO `entries` ( 'hidden_status') VALUES (x'30')
条目和hidden_status
的模式为:
t.binary "hidden_status", limit: 1
复选框为:
<%= newEntry.check_box(:hidden_status,{checked:true},1,0)%>
我怀疑这与数据类型为"0"有关;位";?然而,我不确定,因为我是Ruby Rails的新手,根据我查找的信息,BIT是在SQL中实现布尔值/真值与假值的唯一方法。看起来该值显示为x'30'
。不知道这意味着什么。是否有方法允许复选框捕获1或0?
此外,错误中的参数显示,无论复选框是否选中,复选框的值始终返回0
。不确定这是单独的问题还是与错误有关。
MySQL截至2020年仍未实现真正的布尔列类型。但它确实允许您使用BOOLEAN/BOOL:声明表
CREATE TABLE tasks (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
completed BOOLEAN
);
实际创建的是tiny_int(1)
列。尽管目前的建议是使用位列,但我怀疑Rails适配器是否知道如何将其映射到布尔值。
你可以在Rails中创建迁移,就像在一个真正成熟的数据库中一样(Postgres笑(:
class CreateTasks < ActiveRecord::Migration[6.0]
def change
create_table :tasks do |t|
t.string :title
t.boolean :completed
t.timestamps
end
end
end
schema.rb
仍然会将其列为布尔列,因为它是数据库模式的抽象多语言表示,但MySQL会将其存储为tiny_int(1)
,数据库驱动程序会将其转换为布尔,这样您就不必在Rails中处理1和0了。