2014-04-18 149 views
1

我在我的DB(.sqlite3)中有布爾列。它可能是't'或'f'。更改DB中的默認布爾值

t.boolean :disable_product_category 

如何將值更改爲1或0?

編輯: 我覺得這Rails 3 SQLite3 Boolean false

我編輯active_record/connection_adapters /抽象/ quoting.rb

if column && column.type == :integer 
    value ? 1 : 0 
else 
    value ? 't' : 'f' 
end 

將't'和'f'替換爲1和0後,所有工作都按我的意願進行。

這是正常的解決方案嗎?我想用這個:?

# config/initializers/sqlite3_adapter_patch.rb 

module ActiveRecord 
    module ConnectionAdapters 
    class SQLite3Adapter < AbstractAdapter 
     QUOTED_TRUE, QUOTED_FALSE = "'t'", "'f'" 

     def quoted_true 
     QUOTED_TRUE 
     end 

     def quoted_false 
     QUOTED_FALSE 
     end 
    end 
    end 
end 

但它不工作:(它是需要以某種方式更新應用程序

回答

0

一個布爾值可以是「T」,「F」內部表示,1 0,但在你的代碼,你可以把列的值作爲普通的布爾值

添加default參數來設置列的默認值:

t.boolean :disable_product_category, default: false 
+0

我在Rails和Java應用程序中使用這個數據庫。 Java應用程序使用OrmLite,它們使用0和1布爾值進行操作。我需要將Rails上的char('t'或'f')布爾值更改爲1或0. –

0

布爾數據類型存儲在整數0(假)和1(真)中。正如你所提到的,你的disable_product_category作爲tf進來,你的關注應該在這些文字的翻譯適當的布爾值,以便正確的價值被寫入數據庫。

爲了達到這個目的,你可以覆蓋設定者disable_product_category並進行適當的翻譯,例如,

class Foo < ActiveRecord::Base 

    def disable_product_category=(value) 
    value = true if value == 't' 
    value = false if value == 'f' 
    super(value) 
    end 
end 
+0

可以用'super(value =='t')簡化' – Kyle

+0

@Kyle,當然,我理解你的擔心,代碼可以壓縮。然而,在附註中,'nil' /'DBNULL'也是一個可能的值,'super(value =='t')'會使所有的值除了't','false'? – vee

+0

但是在DB中是'f'。 ** DEF disable_category =(值) 超級(0) 端** –