Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用迁移将字段更改为非空,并使用空字段_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 使用迁移将字段更改为非空,并使用空字段

Ruby on rails 使用迁移将字段更改为非空,并使用空字段,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,因此,我错误地创建了一个表,其中的字段本应不为NULL 我需要创建一个迁移,将字段从NULL改为notnull,但是存在一些已经为NULL的行 我可以更新这些行并更改字段吗?我试过这个: def change change_column :countries, :effective_date, :date, :null => false, :default => Time.now change_column :countries, :expiry_date, :d

因此,我错误地创建了一个表,其中的字段本应不为NULL

我需要创建一个迁移,将字段从NULL改为notnull,但是存在一些已经为NULL的行

我可以更新这些行并更改字段吗?我试过这个:

  def change
    change_column :countries, :effective_date, :date, :null => false, :default => Time.now
    change_column :countries, :expiry_date, :date, :null => false, :default => Time.new(9999,12,31)
  end
但这失败了,出现了一个错误:

Mysql2::错误:无效使用空值:ALTER TABLE


有什么想法吗?需要同时在mysql和sql server上工作。

首先确保没有空值,然后更改约束

备选案文1:

Country.where(effective_date: nil).update_all(effective_date: Time.now)
Country.where(expiry_date: nil).update_all(expiry_date: Time.new(9999,12,31))
change_column :countries, :effective_date, :date, :null => false
change_column :countries, :expiry_date, :date, :null => false
备选案文2:

change_column_null :countries, :effective_date, false, Time.now
change_column_null :countries, :expiry_date, false, Time.new(9999,12,31)

可以在添加约束之前为所有空列设置默认值,例如:

execute "UPDATE study_sites SET patients_recruited = 0 WHERE patients_recruited IS NULL"
change_column :study_sites, :patients_recruited, :integer, default: 0, null: false

put:null=>false在默认值之后,检查它是否工作。仍然得到相同的错误!请查看链接第一种方法给出了错误:参数数目错误(2代表1)C:“update_all”中的。我相信这在Rails4中是不推荐的。据我所知,第二种方法不适用于SQL server。我相信你说的第一种方法在rails 4中被弃用是对的。为什么你认为第二条路行不通?您可以在迁移中执行rails中可以执行的所有操作。顺便说一句,我检查了change\u column\u null的文档,它接受了可选的第4个参数,我用它更新了答案。JRuby和SQL Server组合不支持该change\u column\u null。因此,当我们在那个环境中运行迁移时,迁移实际上失败了。有趣的是,我不知道这一点。你试过1和2的组合吗?用选项1更新了答案。顺便说一句,SQLServer适配器实现了
change\u column\u null
方法。您收到的错误消息是什么?