Rails复选框未存储正确的值



我正在使用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了。

最新更新