Ruby on rails 何时(如果)整合ActiveRecord迁移?
当我在我的应用程序*上进行迭代时,我积累了迁移。到目前为止,有48个这样的文件,跨越了大约24个月的活动 我正在考虑将我当前的Ruby on rails 何时(如果)整合ActiveRecord迁移?,ruby-on-rails,ruby,activerecord,migration,Ruby On Rails,Ruby,Activerecord,Migration,当我在我的应用程序*上进行迭代时,我积累了迁移。到目前为止,有48个这样的文件,跨越了大约24个月的活动 我正在考虑将我当前的schema.rb作为基线 我还考虑删除(当然要受源代码控制)现有的迁移,并从我当前的模式中创建一个新的迁移?迁移倾向于使用符号,但是rakedb:schema:dump使用字符串:我应该关心吗 这看起来合理吗? 如果是的话,在什么样的时间间隔内进行这样的练习才有意义? 若否,原因为何 我是否错过了一些(rake?)可以帮我完成的任务 *在我的例子中,所有应用程序都是基于
schema.rb
作为基线
我还考虑删除(当然要受源代码控制)现有的迁移,并从我当前的模式中创建一个新的迁移?迁移倾向于使用符号,但是rakedb:schema:dump
使用字符串:我应该关心吗
这看起来合理吗?
如果是的话,在什么样的时间间隔内进行这样的练习才有意义?
若否,原因为何
我是否错过了一些(rake?)可以帮我完成的任务
*
在我的例子中,所有应用程序都是基于Rails的,但是任何使用ActiveRecord迁移的应用程序似乎都符合这个问题。我认为有两种迁移:
- 这些是你在设计/开发过程中制作的,因为你改变了对数据库应该是什么样子的想法
- 您在发布之间所做的更改,反映了一些行为更改
我读到了关于使用字符串的另一点:“ruby符号是内存泄漏”,这意味着,当您创建一个符号时,它永远不会在应用程序的整个生命周期内得到处理。这对我来说似乎毫无意义,因为您的所有db列都将在Rails(和ActiveRecord)应用程序中用作符号;迁移任务也不会永远持续下去,因此我认为这一点实际上没有意义。您不应该删除迁移。为什么要创造额外的工作 迁移本质上是一组指令,用于定义如何构建数据库以支持应用程序。在构建应用程序时,迁移会记录对数据库所做的迭代更改 IMHO通过定期重置基线,您所做的更改可能会在应用程序中引入错误/问题,从而产生额外的工作 如果列被错误地添加,然后需要稍后删除,只需创建一个新的迁移来删除额外的列。我这样做的主要原因是,在团队中工作时,您不希望同事必须从头开始重建数据库。通过这种简单的方法,您(和他们)可以以迭代的方式继续工作
另一方面,当从头开始构建新数据库(没有任何数据)时,迁移往往运行得非常快。我目前正在从事的一个项目有177次迁移,这在构建新数据库时不会造成任何问题。虽然我相信每个人都有自己的做法,但迁移系统的工作方式隐含着一些规则:
- 决不要将更改提交给其他开发人员或以前的部署可能使用过的迁移。相反,进行额外的迁移以根据需要进行调整
- 永远不要在迁移中放置模型级依赖项。该模型可能在将来某个时候被重命名或删除,这将阻止迁移。尽可能保持迁移的自包含性,即使这意味着迁移非常简单和低级
我唯一认为它是合理可行的情况是,如果您正在分叉一个旧项目以创建新版本或衍生产品,并且不想进行大量迁移。是的,这是有意义的。有一种整合迁移的做法。要做到这一点,只需将当前模式复制到迁移中,并删除所有以前的迁移。这样,要管理的文件就更少了,测试可以运行得更快。在这样做时需要小心,尤其是在生产环境中自动运行迁移的情况下。我通常用新的模式替换我知道每个人都运行过的迁移 其他人做这件事的方式略有不同 一般来说,在我们进行了100多次迁移之前,我都没有这样做过,但经过几个月的开发,我们可以做到这一点。但是,随着项目的成熟,迁移的次数越来越少,因此您可能不必再次进行迁移 这与最佳实践背道而驰:一旦您签入到源代码管理的迁移,就不要更改它。如果其中有一个bug,我会做出一个罕见的例外,但这是非常罕见的(100分之一可能)。原因是,一旦它们在野外,一些人可能已经把它们赶走了。它们被记录为已在数据库中完成。如果您更改它们并签入新版本,其他人将无法从更改中获益。您可以要求人们回滚某些更改,并重新运行它们,但这违背了自动化的目的。
# This file is auto-generated from the current state of the database. Instead of editing this file,
# please use the migrations feature of Active Record to incrementally modify your database, and
# then regenerate this schema definition.
#
# Note that this schema.rb definition is the authoritative source for your database schema. If you need
# to create the application database on another system, you should be using db:schema:load, not running
# all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended to check this file into your version control system.