【问题标题】:How do I disable the migrations feature in a Rails app?如何禁用 Rails 应用程序中的迁移功能?
【发布时间】:2014-09-07 06:08:11
【问题描述】:

背景

我们分别设计数据库模型和应用程序模型(RDMBS 架构师与 OOP 工程师)。从我所看到的关于 Rails 与域/键范式的情况来看,Rails 迁移无法轻松复制精心设计的企业 RDBMS 的所有功能(如果有的话),因此我们不迁移而是使用其他工具来构建数据库(不要介意对象关系阻抗不匹配的问题)。数据完整性和数据库性能对我们来说太宝贵了,不能冒任何开发人员更改 RDBMS 模型的风险。

问题

无论出于何种原因,我们现在有一个 Rails 应用程序通过迁移对数据库进行了破坏性更改。如何在现有 Rails 应用程序中彻底禁用此功能?

我有我的理论,但我想知道世界的想法。

【问题讨论】:

  • 总是最好地分享您的理论并展示您在问题中尝试过的内容。
  • 如果您使用 capistrano 进行部署,我敢打赌您可以将其配置为跳过 db:migrate rake 任务。不确定其他部署工具。
  • 您可以查看 this 之类的内容,然后覆盖所有数据库 rake 任务以不执行任何操作 - 或者可能显示一条消息“Naughty developer”?我认为实际上没有办法通过配置选项禁用它们
  • 同意,只需编写您自己的任务,或创建一个迁移模板,该模板不允许任何内容,或您认为“可以”的部分内容;见stackoverflow.com/q/5202008/438992
  • @Brian。是的,使用 Capistrano,但希望得到比 cap 或 rake 更低的级别。我相信即使没有上限部署,我们也可以修改其中一个开发数据库,​​我也想避免这种情况。我更多地考虑用逐项列表替换require 'rails/all'。从 cap 任务中删除 migrate 将是一个很好的第二层强制执行。另一种选择是创建两个 DB 用户:一个用于 DB 工作,一个用于具有较少权限的 Rails。不知道这将如何结束,但可能是最聪明的路线。尽管如此,仍然想步履蹒跚。

标签: ruby-on-rails oop database-design rails-activerecord rails-migrations


【解决方案1】:

当测试终于出现时,这又出现了。因此,我进行了更深入的研究,并想出了以下部分感谢问题留下的 cmets。这删除了所有 rake DB 功能,测试仍然运行良好。 (如果有人想知道,当我们需要刷新它时,我们会从其他地方克隆测试数据库。)

将此添加到Rakefile

# Disable DB migrations, DB test preparing, etc.
Rake::Task.tasks.each do |t|
    if t.name[0,3] == "db:"
        t.clear
        t.add_description("!!! Disabled in favor of enterprise design at Acme.")
    end
end

注释掉test/test_helper.rb中的所有灯具:

#fixtures :all

【讨论】:

    【解决方案2】:

    在 juanitogan 的回答中,我们禁用了所有数据库任务。就我而言,我仍然希望能够运行db:schema:load。这里Rakefile的代码稍作修改:

    # Disable migrations
    Rake::Task.tasks.each do |t|
      if t.name.start_with?("db:migrate")
        t.clear
        t.add_description("Disabled; Load the data model via db:schema:load.")
        t.actions << proc { puts "Migrations ignored. That's ok. Please see README."}
      end
    end
    

    创建模型时,您可以像这样附加--no-migration 选项:rails g model abc --no-migration

    【讨论】:

    • 您的意思是允许db:schema:load 吗?这会将 schema.rb 应用于当前的数据库环境并销毁所有数据。我认为您的意思是允许db:schema:dump,它创建一个与数据库匹配的schema.rb。不过,您仍然希望阻止 db:schema:load,而不仅仅是迁移任务。
    • 实际上,我的意思是db:schema:load,因为我有一个规定的架构并且想要加载它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多