Tim*_*and 6 ruby migration activerecord ruby-on-rails helper
我需要在多次迁移中重用相同的方法。我的目标是避免代码重复。我尝试如下所示,将共享方法放入文件中lib/migration_helper.rb并include 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
刚刚测试,适用于 Rails 7(可能还有更早的版本)
你可以做的是:
1 - 在任何地方创建你的文件/类
# 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 个助手,您只会失去一个)几秒钟)