2012-07-26 76 views
2

我已經編寫了一個使用傳統MySQL數據庫的Rails應用程序。一個表包含這一領域Rails無法識別傳統數據庫上的布爾字段

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

我固定

t.boolean "active", :default => false 

但軌方案不承認那場布爾

[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 

有沒有什麼辦法讓視爲布爾我的遺產列(可能不運行遷移)?

回答

0

好吧,我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 
0

短的在TrueClassFalseClassoverriding方法會是接受簡單地定義爲您的驗證使用自己的「遺產」布爾值,沿着這些線路:

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

我也會允許'true'&'false',除非它們根本不工作(即,試圖在該列中插入「true」或「false」給出不正確的結果)。 – Romain 2012-07-26 12:14:36