【问题标题】:Rails migration default 0 is not false?Rails 迁移默认 0 是不是假的?
【发布时间】:2015-12-29 11:23:44
【问题描述】:

在我的迁移文件中:

class AddEnabledToJob < ActiveRecord::Migration
  def change
    add_column :jobs, :enabled, :boolean, default: 0
  end
end

但是在我看来,我正在寻找每个 :enabled =&gt; false 对象:

<% @jobs.where(enabled: false).order("id DESC").each do |job| %>

这不起作用。如果我将其更改为:

<% @jobs.where(enabled: 0).order("id DESC").each do |job| %>

这很令人困惑,因为我在应用程序的其他位置将 enabled 值更改为 false,所以我有一些带有 enabled: false 的 Job 对象和一些带有 enabled: 0 的 Job 对象。我该如何纠正这种情况以及为什么会发生这种情况?

编辑:

为了解决这个问题,我已经通过控制台填充了所有作业 (Job.all),我看到虽然新记录是使用 default: 0 创建的,但它们的值是 false。那么为什么@jobs.where(enabled: false) 无法检索到它们呢?

【问题讨论】:

  • 这可能是因为 activercord 将 0 转换为 false 但是当您说 .where(enabled: 0) 由您的数据库本身处理 postgres 或您使用的任何内容时,它会执行查询搜索0 不是假的。

标签: mysql ruby-on-rails ruby-on-rails-4


【解决方案1】:

使用change_column_default将默认值更改为false,并允许每个0为旧记录为false:

def up
  change_column_default :jobs, :enabled, false
  Job.where(enabled: 0).update_all(enabled: false)
end

def down
  change_column_default :jobs, :enabled, 0
end

【讨论】:

  • 很多关于如何将默认布尔值设置为 false 的答案说要使用 ":boolean, default: 0" 为什么会这样?
  • 这个仅用于更改默认值,但如果您还想更改任何其他内容,例如更改列名称或类型甚至默认值,则 change_column 如果您检查了您发布的链接检查答案遵循接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多