Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.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 Rails迁移:撤消列的默认设置_Ruby On Rails_Rails Migrations - Fatal编程技术网

Ruby on rails Rails迁移:撤消列的默认设置

Ruby on rails Rails迁移:撤消列的默认设置,ruby-on-rails,rails-migrations,Ruby On Rails,Rails Migrations,我有一个问题,我在Rails中进行了迁移,为列设置了默认设置,如下面的示例: def self.up add_column :column_name, :bought_at, :datetime, :default => Time.now end 假设我想在以后的迁移中删除该默认设置,那么如何使用rails迁移呢 我当前的解决方法是在rails迁移中执行自定义sql命令,如下所示: def self.up execute 'alter table column_name alte

我有一个问题,我在Rails中进行了迁移,为列设置了默认设置,如下面的示例:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end
假设我想在以后的迁移中删除该默认设置,那么如何使用rails迁移呢

我当前的解决方法是在rails迁移中执行自定义sql命令,如下所示:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end
但是我不喜欢这种方法,因为我现在依赖于底层数据库如何解释这个命令。在数据库发生变化的情况下,此查询可能不再工作,迁移将中断。那么,有没有一种方法可以表示撤销rails中某列的默认设置呢?

就像文档指出的那样,您的“执行”操作是正确的:

为列设置新的默认值。 如果要设置默认值 若为空,则表示您运气不佳。你需要 要创建数据库语句,请执行 您可以自己使用适当的SQL语句。 例子

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
轨道5+
def更改
更改列\默认值(:表\名称,:列\名称,从:nil更改为:false)
结束
轨道3和轨道4
def up
更改列\默认值(:表\名称,:列\名称,无)
结束
降下
更改列\默认值(:表\名称,:列\名称,false)
结束

我使用以下代码片段来生成
NULL
非NULL
,但在架构级别跳过
DEFAULT

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end
轨道4

change_column :courses, :name, :string, limit: 100, null: false

谢谢我自己还没有在文档中找到这个提示!他们希望在rails未来版本的迁移中加入默认值。这在rails 3.1.0,cfr中不再是事实。我看不到这个答案的附加值,因为接受的答案是相同的。在postgres中,这实际上不会删除
字符变化
列的默认值,只需将其设置为
NULL::字符变化
。在更新的版本中,您可以使其可逆。例如:
change\u column\u default(:table\u name,:column\u name,from:nil,to:false)
@AttilaO。我已经成功运行了
ALTER TABLE\u name ALTER COLUMN type DROP DEFAULT
,我想不需要将其设置为
NULL
。仅供参考,@Mark提到的可逆版本似乎是在Rails 5+中添加的,因此任何低于该版本的内容都将无法使用。这一版本添加了非NULL约束,它与DEFAULT无关与DEFAULT+1无关
change_column :courses, :name, :string, limit: 100, null: false