sql - Rails 复选框未存储正确的值
问题描述
我正在使用 Ruby Rails 创建一个表单。它有一个复选框,选中时表示该条目应该被隐藏(真或位 1. vs 假/位 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)%>
我怀疑这与“位”的数据类型有关吗?但是我不确定,因为我是 Ruby Rails 的新手,从我查找的内容来看,BIT 是在 SQL 中执行布尔值/真值与假值的唯一方法。看起来价值正在上升为 as x'30'
。不确定那是什么意思。有没有办法让复选框捕获 1 或 0?
此外,错误中的参数显示复选框的值始终返回0
该框是否被选中。不确定这是一个单独的问题还是与错误有关。
解决方案
截至 2020 年,MySQL 仍未实现真正的布尔列类型。但它确实允许您使用 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)
,并且数据库驱动程序将负责将其转换为布尔值,因此您不必处理 1 和 0导轨。
推荐阅读
- python - Python 中的顶部/底部规则条件格式,如 Excel
- mongodb - 如何在给定条件下更新 mongoDB 中的特定字段?
- ruby-on-rails - 在 AWS 中使用 Rails 后端和 React 前端部署 webapp
- python - 将元素附加到数组数组
- mongodb - Mongo 副本端点
- node.js - 节点应用程序发布方法console.log中的bodyParser响应“未定义”
- cplex - 在 CPLEX ILOG 中表达方程
- flutter - 应用程序重新启动时 Flutter 设置状态不起作用
- elf - 为什么 readelf 不报告正确的尺寸?
- javascript - Chrome 存储返回未定义的异步/等待