Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails数据库布尔值_Sql_Ruby On Rails_Sqlite_Activerecord_Boolean - Fatal编程技术网

Sql Rails数据库布尔值

Sql Rails数据库布尔值,sql,ruby-on-rails,sqlite,activerecord,boolean,Sql,Ruby On Rails,Sqlite,Activerecord,Boolean,代码优先: create_table :users do |t| ... t.boolean :is_active, :default => true ... end 现在,我的问题是——我正在创建一个rake任务来导入大量记录(10000+)。我已经做了大量的测试和基准测试,并确定执行此任务的最快和最有效的方法是创建一个巨大的原始SQL语句。(我正在从CSV读取数据)。例如: inserts = Array.new FasterCSV.foreach(...) do |ro

代码优先:

create_table :users do |t|
  ...
  t.boolean :is_active, :default => true
  ...
end
现在,我的问题是——我正在创建一个rake任务来导入大量记录(10000+)。我已经做了大量的测试和基准测试,并确定执行此任务的最快和最有效的方法是创建一个巨大的原始SQL语句。(我正在从CSV读取数据)。例如:

inserts = Array.new
FasterCSV.foreach(...) do |row|
  inserts.push "(row[0], row[1]...)"
end
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}"
一切都很好。整个过程在(字面上)秒内完成,而不是使用ActiveRecord的1.5小时。但是,我的问题在于布尔字段。我在SQLite上进行本地开发,但MySQL是在生产环境中开发的。在使用ActiveRecord时,Rails决定在“boolean”字段中放置什么(因为几乎所有数据库都不同)。我正在编写自定义SQL,我想知道是否有一种方法可以执行以下操作

INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
…正确返回特定于数据库的布尔值

任何回答“仅使用ActiveRecord”的人都将被否决。在这种情况下根本不可行。我也不愿意使用tinyint(1)字段并使用1或0

总之,
的值处于活动状态
需要根据当前数据库连接进行更改


这可能吗?

我相信您可能正在寻找
ActiveRecord::Base.connection.quoted\u true


这将返回带引号的本机布尔值,例如,对于SQL Server或MySQL为“1”,对于PostgreSQL或SQLite为“t”

为什么不使用MySQL进行本地开发?这将解决这个问题以及其他不兼容问题。我通常处理布尔人的方式是使用事先准备好的陈述,但对你们不起作用。但这并不能回答我的问题。如果我想在某个时候使用POSTgres或MSSQL呢?非常感谢!你是怎么找到这个的?!此外,可能值得编辑您的答案(仅针对可能有此问题的其他人)以提及它自动包含引号(')。例如,如果连接是sqlite,它会返回't'而不仅仅是t.Heh。为了找到它,我在查看ActiveRecord连接适配器的代码时玩得很开心。为了清楚起见:可以在类方法中使用self.connection.quoted_*和在实例方法中使用self.class.connection.quoted_*。