Rails:维护依赖于应用程序的数据

Rails: maintaining application-dependent data

在我的应用程序中,account 有各种需要向用户显示的独特消息 (message_templates)。例如,在创建新 post 时,在一个帐户中,他们可能会显示 "Thanks for creating the post!" 而另一个帐户可能想说 "The post was successfully created!".

有一定数量的应用内 message_templates 仅在特定时间触发。因此,每个帐户将具有相同的编号,只是值不同。

account = Account.create!
MessageTemplate.create(account: account, slug: "post_created_thank_you", body: "Thank you for creating the post!")
...
# Can change the body column but nothing else.

def PostsController < ApplicationController
  def create
    # create the post...
    @thank_you_message = current_account.message_templates.find_by(
      slug: "post_created_thank_you"
    )
  end
end

然而,当我向应用程序添加功能时,我发现有时我想添加另一个 message_template 并且我需要确保为所有当前帐户创建此模板。

我正在考虑使用 Rails 迁移来确保每个 account 都有不同的 message_templates 但迁移实际上是针对数据库架构更改而不是应用程序数据更改。

我也看过 rake db:seed,但这实际上是为了最初播种数据库,而不是为了维护更新。

一个解决方案是创建 rake 任务,每当我添加新的模板化消息时,我都会手动执行这些任务。看起来有点笨重。

我真正想要的是为数据构建的迁移。这似乎是一个常见问题,是否有实现此标准的方法?否则我可能最终会写一个实现数据迁移的 gem。

您可以像在种子文件中一样在迁移中创建数据,例如:

def up
   Account.each do |account|
     MessageTemplate.create(account: account, slug: "post_created_thank_you", body: "Thank you for creating the post!")
  end
end
def down
  MessageTemplate.where(slug: "post_created_thank_you").delete_all
end

或者更好的想法是将上面的内容变成 SQL 插入,这样它运行得更快...