Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 何时(如果)整合ActiveRecord迁移?_Ruby On Rails_Ruby_Activerecord_Migration - Fatal编程技术网

Ruby on rails 何时(如果)整合ActiveRecord迁移?

Ruby on rails 何时(如果)整合ActiveRecord迁移?,ruby-on-rails,ruby,activerecord,migration,Ruby On Rails,Ruby,Activerecord,Migration,当我在我的应用程序*上进行迭代时,我积累了迁移。到目前为止,有48个这样的文件,跨越了大约24个月的活动 我正在考虑将我当前的schema.rb作为基线 我还考虑删除(当然要受源代码控制)现有的迁移,并从我当前的模式中创建一个新的迁移?迁移倾向于使用符号,但是rakedb:schema:dump使用字符串:我应该关心吗 这看起来合理吗? 如果是的话,在什么样的时间间隔内进行这样的练习才有意义? 若否,原因为何 我是否错过了一些(rake?)可以帮我完成的任务 *在我的例子中,所有应用程序都是基于

当我在我的应用程序*上进行迭代时,我积累了迁移。到目前为止,有48个这样的文件,跨越了大约24个月的活动

我正在考虑将我当前的
schema.rb
作为基线

我还考虑删除(当然要受源代码控制)现有的迁移,并从我当前的模式中创建一个新的迁移?迁移倾向于使用符号,但是
rakedb:schema:dump
使用字符串:我应该关心吗

这看起来合理吗? 如果是的话,在什么样的时间间隔内进行这样的练习才有意义? 若否,原因为何

我是否错过了一些(rake?)可以帮我完成的任务


*
在我的例子中,所有应用程序都是基于Rails的,但是任何使用ActiveRecord迁移的应用程序似乎都符合这个问题。

我认为有两种迁移:

  • 这些是你在设计/开发过程中制作的,因为你改变了对数据库应该是什么样子的想法

  • 您在发布之间所做的更改,反映了一些行为更改

我会尽快摆脱第一种迁移,因为它们并不真正代表工作版本,而保留第二种迁移,以便在理论上可以更新应用程序

关于符号与字符串:许多人认为在迁移中只应使用字符串:符号是对象的“句柄”,不应用于表示名称(在本例中是列名和表名)。这仅仅是一个风格上的考虑,但让我信服了,我不再在迁移中使用符号


我读到了关于使用字符串的另一点:“ruby符号是内存泄漏”,这意味着,当您创建一个符号时,它永远不会在应用程序的整个生命周期内得到处理。这对我来说似乎毫无意义,因为您的所有db列都将在Rails(和ActiveRecord)应用程序中用作符号;迁移任务也不会永远持续下去,因此我认为这一点实际上没有意义。

您不应该删除迁移。为什么要创造额外的工作

迁移本质上是一组指令,用于定义如何构建数据库以支持应用程序。在构建应用程序时,迁移会记录对数据库所做的迭代更改

IMHO通过定期重置基线,您所做的更改可能会在应用程序中引入错误/问题,从而产生额外的工作

如果列被错误地添加,然后需要稍后删除,只需创建一个新的迁移来删除额外的列。我这样做的主要原因是,在团队中工作时,您不希望同事必须从头开始重建数据库。通过这种简单的方法,您(和他们)可以以迭代的方式继续工作


另一方面,当从头开始构建新数据库(没有任何数据)时,迁移往往运行得非常快。我目前正在从事的一个项目有177次迁移,这在构建新数据库时不会造成任何问题。

虽然我相信每个人都有自己的做法,但迁移系统的工作方式隐含着一些规则:

  • 决不要将更改提交给其他开发人员或以前的部署可能使用过的迁移。相反,进行额外的迁移以根据需要进行调整
  • 永远不要在迁移中放置模型级依赖项。该模型可能在将来某个时候被重命名或删除,这将阻止迁移。尽可能保持迁移的自包含性,即使这意味着迁移非常简单和低级
当然也有例外。例如,如果迁移不起作用,无论出于何种原因,可能需要一个补丁来更新它。尽管如此,迁移所影响的变化的性质不应该改变,尽管它们的实现可能会改变

任何成熟的Rails项目都可能有大约200到1000次迁移。根据我的经验,除了在规划阶段,一个少于30人的项目是很少见的。毕竟,每个模型通常都需要自己的迁移文件

在处理不断发展的软件时,将多个迁移合并为一个迁移是一个坏习惯。您可能不会折叠源代码管理历史记录,那么为什么要担心数据库模式历史记录呢


我唯一认为它是合理可行的情况是,如果您正在分叉一个旧项目以创建新版本或衍生产品,并且不想进行大量迁移。

是的,这是有意义的。有一种整合迁移的做法。要做到这一点,只需将当前模式复制到迁移中,并删除所有以前的迁移。这样,要管理的文件就更少了,测试可以运行得更快。在这样做时需要小心,尤其是在生产环境中自动运行迁移的情况下。我通常用新的模式替换我知道每个人都运行过的迁移

其他人做这件事的方式略有不同

一般来说,在我们进行了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.