Rails数据库布尔值

15

首先编写代码:

create_table :users do |t|
  ...
  t.boolean :is_active, :default => true
  ...
end

现在,我面临的问题是 - 我正在创建一个rake任务来导入大量记录(10,000+)。我已经进行了广泛的测试和基准测试,并确定执行此任务的最快和最有效的方法是创建一个巨大的原始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确定要将什么放入“布尔”字段(因为几乎所有数据库都不同)。我正在编写自定义SQL,并想知道是否有办法做到这样...

INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)

......能够正确返回特定数据库的布尔值。

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

总之,is_active的值需要根据当前数据库连接而更改......

这是否可能?


为什么不在本地使用MySQL进行开发?这将解决此问题以及其他不兼容性。我通常处理布尔值的方式是使用预处理语句,但这对您不起作用。 - Paul Schreiber
但这并没有回答我的问题。如果我想在某个时候使用POSTgres或MSSQL怎么办? - sethvargo
1个回答

31

我相信你可能正在寻找ActiveRecord::Base.connection.quoted_true

这将返回原生布尔值并用引号括起来,例如对于SQL Server或MySQL,返回'1',而对于PostgreSQL或SQLite,则返回't'


非常感谢!你是在哪里找到这个的?此外,编辑你的回答可能会更值得(只为其他可能遇到此问题的人)提及它自动包含引号(')。例如,如果连接是SQLite,它返回的是 't' 而不仅仅是 t。 - sethvargo
2
嘿,为了找到它,我在查找ActiveRecord连接适配器的代码时感到非常有趣。 - Scott
1
仅为了清晰起见:您可以在类方法中使用self.connection.quoted_*,并在实例方法中使用self.class.connection.quoted_*。 - Phillip Koebbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接