【问题标题】:Creating a Rails Migration to add a Friendly_id column (which is null) to a table with data创建 Rails 迁移以将 Friendly_id 列(为空)添加到包含数据的表中
【发布时间】:2016-05-11 12:48:16
【问题描述】:

我有一个包含数据的表,我想添加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=>false 的字段。

我该怎么做?

谢谢

【问题讨论】:

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


    【解决方案1】:

    要解决这个问题,你需要添加列,但不要放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
    

    【讨论】:

    • 确实,这也是我的第一个想法。如果有办法在迁移中完成所有这些,我只是在徘徊:)
    • @Tiago 我改变了答案来做到这一点。看看;)
    • 是的,这正是我所做的,它就像一个魅力!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2014-12-25
    • 2016-05-11
    • 2011-09-02
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多