跨多个迁移重用代码:帮助程序模块和帮助程序方法

Tim*_*and 6 ruby migration activerecord ruby-on-rails helper

我需要在多次迁移中重用相同的方法。我的目标是避免代码重复。我尝试如下所示,将共享方法放入文件中lib/migration_helper.rbinclude MigrationHelper在使用共享方法的迁移中使用。

是否有更标准的方式在不同的迁移中共享代码?

特别是,我将帮助程序文件放入lib目录中 - 这是正确的位置吗?

## lib/migration_helper.rb

# Methods shared across migrations.

module MigrationHelper
  def my_shared_method
    # some shared code
  end
end
Run Code Online (Sandbox Code Playgroud)
## db/migrate/do_something.rb

class DoSomething < ActiveRecord::Migration[5.2]
  include MigrationHelper
  # rubocop:disable Metrics/MethodLength
  def up
    # some code
    my_shared_method
  end
  # rubocop:enable Metrics/MethodLength

  def down
    # more code
    my_shared_method
  end

Run Code Online (Sandbox Code Playgroud)

也可以看看:

我从这些问题中得到了一些想法,但它们并没有完全回答我的问题:
Rails 3.2 迁移的自定义帮助程序方法
Rails 在迁移之间共享代码(也称为关注点)
访问 Rails 3 迁移中的自定义帮助程序方法

这个存储库包含了我想要的更复杂版本的示例,以及整个帮助器层次结构。我需要一个更简单的解决方案:
https://gitlab.com/gitlab-org/gitlab-foss/blob/master/lib/gitlab/database/migration_helpers.rb
https://gitlab.com/gitlab-org/gitlab-foss //blob/master/db/migrate/20220808133824_add_timestamps_to_project_statistics.rb

Nat*_*ouy 2

刚刚测试,适用于 Rails 7(可能还有更早的版本)

你可以做的是:

1 - 在任何地方创建你的文件/类

  • 应用程序/lib/migration/something.rb
  • db/担忧/something.rb
  • ...
# db/concerns/create_column_alias.rb
module CreateColumnAlias
  def create_column_alias(*args)
    add_column(*args)
  end
end
Run Code Online (Sandbox Code Playgroud)

2 - 创建一个初始化程序以在迁移类中注入新的帮助程序(根据此要点

# initializers/extend_migration_with_custom_helpers.rb

require_relative "../../db/concerns/create_column_alias"

ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include, CreateColumnAlias)
Run Code Online (Sandbox Code Playgroud)

3-利润。

>$ bin/rails g my_migration

# db/migrate/123345456_my_migration.rb
class MyMigration < ActiveRecord::Migration[7.0]
  def change
    create_column_alias :tasks, :done, :boolean
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑

如果您不希望它们包含在任何地方,您可以跳过序列化器并执行

require_relative "../concerns/create_column_alias"

# db/migrate/123345456_my_migration.rb
class MyMigration < ActiveRecord::Migration[7.0]
  include CreateColumnAlias

  def change
    create_column_alias :tasks, :done, :boolean
  end
end
Run Code Online (Sandbox Code Playgroud)

不过我建议你不要这样做,这样可以省去麻烦。即使您不使用它们,让所有助手随时可用也是可以的,特别是考虑到这对生产速度的影响为 0(仅部署部分,而且它是超级小的,就像如果您有 100 个助手,您只会失去一个)几秒钟)