【问题标题】:Rails doesn't recognize boolean fields on legacy databaseRails 无法识别旧数据库上的布尔字段
【发布时间】:2012-07-24 23:15:28
【问题描述】:

我编写了一个使用旧版 MySQL 数据库的 Rails 应用程序。一个表包含该字段

CREATE TABLE `articles` (
  `active` tinyint(3) unsigned NOT NULL DEFAULT '0',
);

我已经用

修复了架构
t.boolean "active",    :default => false

但是 rails 不会将该字段识别为布尔值

[1] pry(main)> Article.new.active.class
=> Fixnum

这将在验证方面产生问题,因为我的班级中有这个验证器

class Article < ActiveRecord::Base
  validates_inclusion_of :active, :in => [true, false]
end

当我为该字段分配布尔值时,它们将转换为 FixNum,验证失败并显示消息 "1 is not included in the list"

如果我生成一个具有相同模型的新应用,生成的 sql 代码是

CREATE TABLE `posts` (
  `active` tinyint(1) DEFAULT NULL,
)

一切正常:

[1] pry(main)> Article.new.active.class
=> FalseClass

有什么方法可以让我的旧列被识别为布尔值(可能无需运行迁移)?

【问题讨论】:

    标签: mysql ruby-on-rails activerecord database-migration


    【解决方案1】:

    TrueClassFalseClass 中缺少overriding 方法,是否可以按照以下方式简单地定义您自己的“旧”布尔值以用于验证:

    class Article < ActiveRecord::Base
      $legacy_false, $legacy_true = 0, 1
      validates_inclusion_of :active, :in => [$legacy_true, $legacy_false]
    end
    

    【讨论】:

    • 我也允许 truefalse,除非它们根本不工作(即尝试在该列中插入 truefalse 给出不正确的结果)旧版存储。
    【解决方案2】:

    好的,我已经 found out 将 MySQL 布尔类型硬编码为 tinyint(1)

    def simplified_type(field_type)
      return :boolean if adapter.emulate_booleans && field_type.downcase.index("tinyint(1)")
    
      case field_type
        when /enum/i, /set/i then :string
        when /year/i         then :integer
        when /bit/i          then :binary
      else
        super
      end
    end
    

    我已在我的数据库上运行此迁移以使其正常工作

    class ChangeBooleanFields < ActiveRecord::Migration
      def up
        change_column :articles, :active, :boolean, :null => false, :default => false, :limit => nil
      end
    
      def down
        change_column :articles, :active, :integer, :null => false, :default => 0, :limit => 1
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2011-05-31
      相关资源
      最近更新 更多