Rails 数据库布尔值

Posted

技术标签:

【中文标题】Rails 数据库布尔值【英文标题】:Rails database boolean values 【发布时间】:2011-05-31 08:06:55 【问题描述】:

代码优先:

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进行本地开发呢?这将解决这个问题以及其他不兼容问题。我通常处理布尔值的方式是使用准备好的语句,但对你不起作用。 这并没有回答我的问题。如果我想在某个时候使用 POSTgres 或 MSSQL 怎么办? 【参考方案1】:

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

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

【讨论】:

非常感谢!你是如何/在哪里找到这个的?!此外,可能值得编辑您的答案(仅针对可能遇到此问题的其他人)以提及它自动包含引号 (')。例如,如果连接是 sqlite,它返回 't' 而不仅仅是 t。 嘿,为了找到它,我在浏览 ActiveRecord 连接适配器的代码时获得了一些乐趣。 为了清楚起见:您可以在类方法中使用 self.connection.quoted_*,在实例方法中使用 self.class.connection.quoted_*。

以上是关于Rails 数据库布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Rails:我如何验证某个东西是布尔值?

Rails 切换布尔值

Rails 4:使用 link_to 切换布尔值

Rails 3 SQLite3 布尔值 false

将 :default => true 添加到现有 Rails 列中的布尔值

Rails 4 的 best_in_place gem 复选框问题(为啥字符串没有转换为布尔值?)