首页 > 解决方案 > 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该框是否被选中。不确定这是一个单独的问题还是与错误有关。

标签: sqlruby-on-railscheckboxbit

解决方案


截至 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导轨。


推荐阅读