Rails数据库布尔值

set*_*rgo 15 sql sqlite activerecord boolean ruby-on-rails

代码优先:

create_table :users do |t|
  ...
  t.boolean :is_active, :default => true
  ...
end
Run Code Online (Sandbox Code Playgroud)

现在,这是我的问题 - 我正在创建一个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(", ")}"
Run Code Online (Sandbox Code Playgroud)

一切都很好.整个过程在(字面上)秒内完成,而不是使用ActiveRecord完成1.5小时.但是,我的问题在于布尔字段.我在SQLite上本地开发,但是在生产中使用MySQL.当使用ActiveRecord时,Rails确定放在"布尔"字段中的内容(因为几乎所有数据库都不同).我正在编写自定义SQL,我想知道是否有办法可以做类似......

INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
Run Code Online (Sandbox Code Playgroud)

...正确返回特定于数据库的布尔值.

任何回答"只使用ActiveRecord"的人都将被拒绝投票.在这种情况下,这根本不可行.我也不愿意使用tinyint(1)字段并使用1或0.

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

这甚至可能吗?

Sco*_*ott 31

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

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

  • 嘿,为了找到它,我看了一下ActiveRecord连接适配器的代码. (2认同)