代码优先:
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需要根据当前的数据库连接进行更改。
is_active
这有可能吗?
我相信您可能正在寻找 ActiveRecord::Base.connection.quoted_true
ActiveRecord::Base.connection.quoted_true
这会返回带引号的本机布尔值,例如对于SQL Server或MySQL为‘1’,对于PostgreSQL或SQLite为’t’