【问题标题】:Data migrations for older version of friendly id旧版本友好 ID 的数据迁移
【发布时间】:2015-07-21 10:01:56
【问题描述】:

我正在将一个非常旧的应用从 friendly_id 3.2 迁移到 5.1。

我有一个用户模型,目前有一个cached_slug 字段。我创建了一个名为 slug 的新字段。最初,我认为我可以将数据从 cached_slug 复制到 slug,但我注意到还有一个名为 slugs 的完整其他表,如下所示:

  create_table "slugs", force: :cascade do |t|
    t.string   "name",           limit: 255
    t.integer  "sluggable_id"
    t.integer  "sequence",                   default: 1, null: false
    t.string   "sluggable_type", limit: 40
    t.string   "scope",          limit: 255
    t.datetime "created_at"
  end

按照 Rails 快速入门的 FriendlyID README 中的说明,我运行了 rails generate friendly_id,它创建了这个表:

create_table "friendly_id_slugs", force: :cascade do |t|
    t.string   "slug",                      null: false
    t.integer  "sluggable_id",              null: false
    t.string   "sluggable_type", limit: 50
    t.string   "scope"
    t.datetime "created_at"
  end

所以现在我很困惑我需要做什么才能完成迁移。我尝试使用控制台创建一个新用户,但 friendly_id_slugs 表仍然是空的,所以我不确定它的用途或用途。

我有两个问题: 1)这个其他表是做什么用的 2) 我需要做什么才能将旧的 slug 迁移到新的表/字段,以便它继续向前工作?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果您不介意丢失 FriendlyId's History 记录(即:旧 slug),

    1. 删除旧的slug
    2. 在 Rails 控制台中,对所有friendly_id 模型运行<ModelName>.find_each(&:save)

    第 2 步应该会重新生成新的 slug。

    警告:在生产服务器上执行此操作之前进行测试!

    更新:您还可以在迁移文件中执行第 2 步

    class RegenerateSlugs < ActiveRecord::Migration
        def change
            # <ModelName>.find_each(&:save)
            User.find_each(&:save)
            Article.find_each(&:save)
        end
    end
    

    【讨论】:

    • 出于 SEO 原因,我想保留旧的蛞蝓。本周末它阅读了一些源代码,看起来我不需要所有额外的表格,除非我想使用:history。所以我可以从旧的 cached_slugs 复制到新的 .slug 字段中,我可能会使用一些历史背景,但这只是我用例的一小部分,所以应该足够好了。谢谢!
    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多