设置默认值时出现空约束错误Ruby On Rails-Postgresql

时间:2018-07-14 12:51:24

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

在我的数据库中,我有一个具有如下所示架构的表

  create_table "external_source", force: :cascade do |t|
    t.string   "external_id"
    t.string   "permalink",                             null: false
    t.datetime "created_at",                            null: false
    t.datetime "updated_at",                            null: false
    t.boolean  "is_deleted",         default: false,    null: false
    t.string   "company_name",       default: ""
    t.boolean  "hide_salary",        default: true,     null: false
  end

但是,当我尝试插入不带is_deleted参数的值时,Rails服务器会引发空约束违反错误,例如:

  

ActiveRecord :: StatementInvalid(PG :: NotNullViolation:错误:null   “ is_deleted”列中的值违反了非空约束

现在,当我设置其默认值时,不会出现此错误。你能告诉我我在做什么错。谢谢

这是要插入的JSON

{
  "data":
  [
    {
      "external_id":"2262a0228sf-1b9e-sd4e76-b5d7-a8ba01783ebb9i3413139",
      "permalink": '234242341',
      "hide": true,
      "company_name": "com1",
    }
  ]
}

2 个答案:

答案 0 :(得分:2)

默认 在迁移中具有不同的用途。如果要将默认值设置为false,则在控制器中未设置任何值时,只需使用

默认:false

在您的情况下,无需使用 null:false 参数。 默认将为您完成这项工作。有关null和default的更多说明,请检查以下链接How do :default => 0 and :null => false differ for integer fields in migrations?

答案 1 :(得分:0)

也许模型中有一个验证,如:validates :is_deleted, presence: true?

  • 摆脱这种验证,或者
  • 保留验证并默认设置为false(如果缺少),即

    def default_deleted_status
      self.status ||= false
    end