2014-04-18 127 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) 端** –