创建Rails迁移以将Friendly_id列(为空)添加到包含数据的表

时间:2016-02-02 16:01:28

标签: ruby-on-rails rails-migrations friendly-id

我有一个包含数据的表格,我想添加friendly_id。

我不知道如何构建我的迁移,因为我无法在其中创建一个表:null => false。我想做的是迁移运行FriendlyId,以便构建slug并将其插入数据库。

我目前的迁移情况如下:

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 =&gt; false的字段。

我该怎么做?

由于

1 个答案:

答案 0 :(得分:2)

要解决此问题,您需要添加列,但不要放置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