创建一个 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