Rails迁移:仅用于架构更改或更新数据?

Web*_*rit 24 migration ruby-on-rails

我是初级Rails开发人员,在工作中我们遇到了以下问题:

只需为一条记录更新列的值.我们做的是创建这样的迁移:

class DisableAccessForUser < ActiveRecord::Migration
  def change
    User.where(name: "User").first.update_column(:access, false)
  end
end
Run Code Online (Sandbox Code Playgroud)

迁移仅适用于架构更改吗?

你还建议其他什么解决方案?

PS:我只能用代码更改它.无法访问控制台.

Pau*_*ter 18

简短版本是,因为迁移仅用于架构更改,所以您不希望使用它们来更改数据库中的实际数据.

主要问题是,如果使用其中一个rake db:schema:load或者加载数据库结构,则其他开发人员可能会忽略您的数据操作迁移rake db:reset.两者都只使用该schema.rb文件加载最新版本的结构,而不接触迁移.

正如Nikita Singh在评论中也指出的那样,我也会说改变行数据的最佳方法是实现一个简单的rake任务,可以根据需要运行,与迁移结构无关.或者,对于第一次安装,该seed.rb文件非常适合加载初始系统数据.

希望漫无边际的帮助.

更新

在一些"官方"来源中找到了一些文档:

  • Rails迁移指南 - 在迁移中使用模型.本节介绍了迁移文件中的数据操作可能导致其他开发人员出现问题的场景.
  • Rails迁移指南 - 迁移和种子数据.与上面相同的文档并没有真正解释为什么在迁移中放置种子或数据操作是不好的,只是说把所有这些都放在seed.rd文件中.
  • 这个答案.这个人基本上说的是我上面写的相同内容,除了它们提供了一本引用Agile Web Development with Rails(第3版)的书,部分由Rails的创建者David Heinemeier Hansson撰写.我不会复制引用,因为您可以在该帖子中阅读它,但我相信它可以让您更好地了解为什么迁移中的种子或数据操作可能被视为不良做法.

  • @bertbruynooghe我曾经认为同样的原因,但这个文件有点不同; 你可能想提交`schema.rb`,以便你可以在任何其他环境(或同事)中使用`db:schema:load`快速重建db结构,而不必担心运行每个darn迁移文件的麻烦.我认为它在文件中也说"......强烈建议将其检入你的版本控制系统......",所以我倾向于认为提交该文件被认为是最佳做法. (3认同)