在rails中的现有数据库中填充somedata的最佳实践

时间:2018-04-05 07:04:13

标签: ruby-on-rails rails-migrations

问题陈述:

我们说我通过rails migration在表table_1中创建了一个新列column_1。现在我想将数据填充到column_1进行一些计算,但它是一次性任务。

方法:

是否优先通过迁移来实现。或者我应该将它添加到种子中然后填充并再次将其删除

还是有其他最佳做法。

4 个答案:

答案 0 :(得分:2)

通常,我们使用Rails迁移来迁移我们的应用程序架构,并使用Rake任务来迁移我们的生产数据。

只有少数情况我们使用Rails迁移来确保数据迁移作为部署的一部分发生。

在所有其他情况下,使用Rake任务为我们提供了更大的灵活性和更少的维护。

查看详细解释here

答案 1 :(得分:1)

即使有不同的方法,最好在 Rake Migrations 中进行,但不要种子。

佣金任务:

Rake任务通常是为了对数据集合执行维护或数据迁移作业。

佣金的例子:

lib/tasks/addData.rake

  desc "TODO"
  task :my_task1 => :environment do
    User.update_all(status: 'active')
  end

migration中执行此操作的示例:

如果您将状态字段添加到user

class AddStatusToUser < ActiveRecord::Migration
  def up
    add_column :users, :status, :string
    User.update_all(status: 'active')
  end

  def down
    remove_column :users, :status
  end
end

为什么不是种子:

种子通常类似于数据库转储,种子文件用于在应用程序启动时第一次将数据填充到数据库中。因此应用程序是用不同的数据启动的。

示例包括应用程序设置,应用程序配置,管理员用户等。

答案 2 :(得分:1)

这实际上是一个基于意见的问题

  

是否优先通过迁移来实现。或者我应该将它添加到种子中然后填充并再次将其删除

这取决于它需要多长时间。

<强> 1。迁移

如果它的一次性任务与迁移相关,但仅当任务将以几分钟运行时。

<强> 2。佣金任务:

如果任务是一次性的,但可能需要几个小时,那么它应该是一个rake任务,而不是迁移。

答案 3 :(得分:0)

一次性任务?肯定会使用迁移,因为它只会在迁移发生时执行。并且之后不会被执行

Rake任务被认为太多,因为您只需要运行一次。任务脚本将保留在那里,直到您决定将其删除。但是,它完全没有意义(建立一些将在不久的将来被删除的东西,除非在某些特殊情况下用于测试目的)

如果您要询问最佳做法,那么人们往往采用不同的方法。这取决于我们试图解决的每个案例。但是,一般来说,有些案例是可以分享的。