创建一个 Rails 迁移以将 Friendly_id 列(为空)添加到包含数据的 table
Creating a Rails Migration to add a Friendly_id column (which is null) to a table with data
我有一个 table 的数据,我想添加 friendly_id。
我不知道如何构建我的迁移,因为当其中有数据时我无法使用 :null=>false 创建 table。我想做的是迁移到 运行 FriendlyId,以便它构建 slug 并将其插入数据库。
我目前的Migration如下:
class AddSlugToSite < ActiveRecord::Migration
def up
add_column :site, :slug, :string
change_column_null :site, :slug, false
add_index :site, :slug, :unique => true
end
def down
remove_column :site, :slug, :string
end
end
还有我的模特:
class Site < ActiveRecord::Base
extend FriendlyId
friendly_id :name, :use => :slugged
end
这是行不通的,因为 Rails 中已有数据时无法使用 null=>false 创建字段。
我该怎么做?
谢谢
要解决这个问题,您需要添加列,但不要放置 null:false
。
在那之后,做一个 rake 任务或另一个迁移来填充这个列,只有在那之后,你执行其他迁移来执行 change_column_null :site, :slug, false
或者您可以在一次迁移中完成所有这些,但这可能会很慢:
class AddSlugToSite < ActiveRecord::Migration
def up
add_column :sites, :slug, :string
Site.where('slug is null').each do |site|
site.slug = nil # The documentation says this will regenerate the slug
site.save!
end
change_column_null :site, :slug, false
add_index :sites, :slug, unique: true
end
def down
remove_column :sites, :slug, :string
end
end
我有一个 table 的数据,我想添加 friendly_id。
我不知道如何构建我的迁移,因为当其中有数据时我无法使用 :null=>false 创建 table。我想做的是迁移到 运行 FriendlyId,以便它构建 slug 并将其插入数据库。
我目前的Migration如下:
class AddSlugToSite < ActiveRecord::Migration
def up
add_column :site, :slug, :string
change_column_null :site, :slug, false
add_index :site, :slug, :unique => true
end
def down
remove_column :site, :slug, :string
end
end
还有我的模特:
class Site < ActiveRecord::Base
extend FriendlyId
friendly_id :name, :use => :slugged
end
这是行不通的,因为 Rails 中已有数据时无法使用 null=>false 创建字段。
我该怎么做?
谢谢
要解决这个问题,您需要添加列,但不要放置 null:false
。
在那之后,做一个 rake 任务或另一个迁移来填充这个列,只有在那之后,你执行其他迁移来执行 change_column_null :site, :slug, false
或者您可以在一次迁移中完成所有这些,但这可能会很慢:
class AddSlugToSite < ActiveRecord::Migration
def up
add_column :sites, :slug, :string
Site.where('slug is null').each do |site|
site.slug = nil # The documentation says this will regenerate the slug
site.save!
end
change_column_null :site, :slug, false
add_index :sites, :slug, unique: true
end
def down
remove_column :sites, :slug, :string
end
end