小编典典

Rails数据库的布尔值

sql

代码优先:

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。

总而言之,for的值is_active需要根据当前的数据库连接进行更改。

这有可能吗?


阅读 155

收藏
2021-03-17

共1个答案

小编典典

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

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

2021-03-17