Rails 3 SQLite3布尔值false

| 我正在尝试在SQLite3表中插入错误的布尔值,但始终会插入真实值。 这是我的迁移:
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :name, :string
      t.column :active, :boolean, :default => false, :null => false
    end
  end

  def self.down
    drop_table :resources
  end
end
当我尝试使用Rails插入时,它会产生以下SQL:
INSERT INTO \"users\" (\"name\", \"active\") VALUES (\'test\', \'f\')
SQLite将\'f \'视为true,因此将true插入到我的数据库中。我希望它生成的查询是:
INSERT INTO \"users\" (\"name\", \"active\") VALUES (\'test\', false)
我究竟做错了什么? 导轨:3.0.7 sqlite3 gem:1.3.3     
已邀请:
SQLite使用1表示true,使用0表示false:   SQLite没有单独的布尔存储类。而是将布尔值存储为整数0(假)和1(真)。 但是SQLite也有一个宽松的类型系统,并且会自动强制转换内容,因此您的
\'f\'
可能被解释为具有“ true”的真实性,仅因为它不为零。 进行一点点挖掘表明您在Rails 3.0.7 SQLiteAdapter中发现了一个错误。在ѭ4we中,我们发现以下内容:
def quoted_true
  \"\'t\'\"
end

def quoted_false
  \"\'f\'\"
end
因此,默认情况下,ActiveRecord假定数据库对布尔列理解
\'t\'
\'f\'
。 MySQL适配器重写了它们,以使用boolean列的
tinyint
实现:
QUOTED_TRUE, QUOTED_FALSE = \'1\'.freeze, \'0\'.freeze

#...

def quoted_true
  QUOTED_TRUE
end

def quoted_false
  QUOTED_FALSE
end
但是SQLite适配器不提供其自己的
quoted_true
quoted_false
实现,因此它获得的默认值不适用于SQLite的布尔值。
\'t\'
\'f\'
布尔值在PostgreSQL中工作,因此也许每个人都将PostgreSQL与Rails 3一起使用,或者他们只是没有注意到他们的查询工作不正常。 我对此感到有些惊讶,希望有人指出我出了错,您不能成为第一个在Rails中使用SQLite的布尔列的人。 尝试用猴子将
def quoted_true;\'1\';end
和ѭ15monkey修补到
ActiveRecord::ConnectionAdapters::SQLiteAdapter
中(或暂时将它们手动编辑成
active_record/connection_adapters/sqlite_adapter.rb
),看看您是否获得了明智的SQL。     
我也遇到了这个,这是猴子补丁的方法:
require \'active_record/connection_adapters/sqlite_adapter\'
module ActiveRecord
  module ConnectionAdapters
    class SQLite3Adapter < SQLiteAdapter
      def quoted_true; \'1\' end
      def quoted_false; \'0\' end
    end
  end
end
我不知道如何继续运行此错误?     
您可能会发现以下代码片段对增加与实际在Rails 4上运行的SQLite布尔列的兼容性很有用(也发布在https://gist.github.com/ajoman/9391708):
# 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
    
该问题于2017年7月12日在master上修复。但是,它不是最新稳定版本(5.1.4)的一部分。已修复的最新版本是v5.2.0.rc1。 可以通过
Rails.application.config.active_record.sqlite3.represent_boolean_as_integer
设置行为(默认值为
true
)。     
该版本可在Rails 4.1中使用。
require \'active_record/connection_adapters/sqlite_adapter\'

module ActiveRecord::ConnectionAdapters::SQLite3Adapter
  QUOTED_TRUE, QUOTED_FALSE = \'t\'.freeze, \'f\'.freeze

  def quoted_true; QUOTED_TRUE end
  def quoted_false; QUOTED_FALSE end
end
常量和ѭ23for是性能,因此ruby不必重新生成这些字符串并在每次调用时进行垃圾回收。     

要回复问题请先登录注册