加载rails迁移的种子数据

时间:2011-08-17 23:28:51

标签: ruby-on-rails ruby migration

我有一个现有的数据库,我在其中将以前的'NULL'列转换为具有默认值的列(并使用所述默认值填充该列)。但是,该值是我需要创建的记录的ID。如果我将此记录放在db/seeds.rb中,它将无法运行,因为db/seeds.rb在迁移后运行 - 但迁移需要种子数据。如果我将记录创建留在迁移中,那么如果我使用db:load创建一个新数据库,则无法获取记录。除了在db/seeds.rb和迁移中复制此内容之外,还有更好的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:10)

虽然我可以理解你想要保持DRY并且不必在migration和seeds.rb中写这个,但我认为你应该在两个地方写它。不仅要使其有效,还要完成与您的问题相关的不同要求。

  1. 无论外部进程如何,您都需要确保迁移能够正确执行。这意味着您应该在该特定迁移中放置所需的任何代码。除了确保您的迁移正确执行之外,这不是为了完成任何事情。假设其他人试图迁移而不知道你将部分代码放在seeds.rb中,那么他们很难弄清楚发生了什么。

  2. 您可以通过在seeds.rb中包含类似的代码来使db:load正常工作。但是,您应该在seeds.rb中评估数据库的当前状态,因为它在迁移后运行。因此,您可以检查列是否存在,以及默认值是什么等。这意味着如果迁移运行并处理所有事情,seeds.rb不会重复工作或不适当地修改值。但是,如果迁移未按预期设置这些变量,则可以设置值。

  3. 我建议将其视为两个独立的问题,这样您就可以更加自信地成功地彼此独立地执行。它还可以为自己或他人理解未来发生的事情提供更好的可维护性。

答案 1 :(得分:3)

在我看来,你应该在db/seeds.rb和迁移中处理这个问题。

迁移用于将现有数据库从旧版本获取到另一个版本,而seeds.rbschema.rb用于具有最新版本的新数据库。