Ruby on rails Rails通过db:migrate在结构数据库更改后执行数据更新的方式是什么?

Ruby on rails Rails通过db:migrate在结构数据库更改后执行数据更新的方式是什么?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在将数据库中的关系从has_many更改为has_many:through。所以现在我有: class Brand < Ar::Base has_many :products end class Product < AR::Base belongs_to :brand end class品牌

我正在将数据库中的关系从has_many更改为has_many:through。所以现在我有:

class Brand < Ar::Base
  has_many :products
end

class Product < AR::Base
  belongs_to :brand
end
class品牌
我将添加一个联接表


当然,我需要在那之后用数据更新数据库。我已经看到,在移民的范围内这样做是不好的做法。如果知道在数据更新完成后我必须运行另一个迁移(即从产品表中删除原始品牌id列),执行此操作的最佳位置是哪里?

除非我误解了您的问题,否则迁移就是进行此转换的位置。迁移的目的是更改模式并迁移现有数据以使用该模式。迁移捕获了分层模式更改的时间方面,因此您可以在时间上向前和向后移动,而不会使数据处于不一致的状态。如果要将行迁移到其他任何地方,则无法保证代码运行时,模式与编写迁移代码时相同


我相信您会在api文档的示例中找到对我立场的支持。您可能会将迁移与填充种子数据(
rakedb:seed
)混淆,后者在
db/seeds.rb
中处理

除非我误解了你的问题,否则迁移就是实现这种转变的地方。迁移的目的是更改模式并迁移现有数据以使用该模式。迁移捕获了分层模式更改的时间方面,因此您可以在时间上向前和向后移动,而不会使数据处于不一致的状态。如果要将行迁移到其他任何地方,则无法保证代码运行时,模式与编写迁移代码时相同


我相信您会在api文档的示例中找到对我立场的支持。您可能会将迁移与填充种子数据(
rakedb:seed
)混淆,后者在
db/seeds.rb
中处理

我认为您至少应该在迁移中包含对运行数据操作的代码(可能是rake任务)的调用,因为您必须在数据操作之后立即运行第二次迁移


如果是我,我会创建一个rake任务来处理数据。这将至少从迁移中删除代码,并允许您在必要时手动运行它。然后编写迁移代码并包含对该rake任务的调用。老实说,我不明白在迁移中不使用数据操作有什么大不了的。尤其是当你在做事情的时候必须按照特定的顺序去做。它们紧密地联系在一起,为什么要将它们完全分开呢

我认为您至少应该在迁移中包含对运行数据操作的代码(可能是rake任务)的调用,因为您必须在数据操作之后立即运行第二次迁移


如果是我,我会创建一个rake任务来处理数据。这将至少从迁移中删除代码,并允许您在必要时手动运行它。然后编写迁移代码并包含对该rake任务的调用。老实说,我不明白在迁移中不使用数据操作有什么大不了的。尤其是当你在做事情的时候必须按照特定的顺序去做。它们紧密地联系在一起,为什么要将它们完全分开呢

这样的一次性更改可以在迁移过程中使用ruby代码完成。迁移不仅仅是为了架构更改。其思想是,通过版本/日期代码,可以确保迁移只运行一次

这样的一次性更改可以在迁移过程中使用ruby代码完成。迁移不仅仅是为了架构更改。其思想是,通过版本/日期代码,可以确保迁移只运行一次

看起来他想运行一个迁移(添加一个联接表),然后操作表中的数据,然后运行另一个迁移。种子是为播种初始数据而添加的,但这不是他想要实现的。。。他想操纵现有的数据。有些人认为不应该通过迁移操作表中的数据。。只有表本身。我认为正确的做法是在一次迁移中进行。运行与第一次迁移相关的更改,迁移数据,然后运行其余更改。如果这三个步骤是耦合的,任何一个都不应该独立发生,那么它们应该包含在一个迁移中。我同意。但可能会将数据操作移动到单独的ruby文件或rake任务中。看起来他想运行迁移(添加一个联接表),然后操作表中的数据,然后再运行另一个迁移。种子是为播种初始数据而添加的,但这不是他想要实现的。。。他想操纵现有的数据。有些人认为不应该通过迁移操作表中的数据。。只有表本身。我认为正确的做法是在一次迁移中进行。运行与第一次迁移相关的更改,迁移数据,然后运行其余更改。如果这三个步骤是耦合的,任何一个都不应该独立发生,那么它们应该包含在一个迁移中。我同意。但可能会将数据操作转移到单独的ruby文件或rake任务中。我同意。我不理解使用架构迁移数据。据我所知,这正是迁移的目的。为什么您希望在您的代码库中有一个只在一次提交中的一个非常精确的时刻才适用的rake任务?撇开观点不谈,如果您不想在迁移中接触数据,那么我同意rake任务是合适的工具