首页 > 解决方案 > 如何禁用 ActiveRecord::Migration 冗长?

问题描述

简而言之,我想删除我在规范文件中使用的 ActiveRecord::Migration.create_table 和 drop_table 函数的显示,我该怎么做?

(我自己回答了,但我仍然认为发布它是个好主意,因为 Rails 中缺乏关于该主题的文档)

加长版:

我在 Rails 应用程序上的 Rspec 中使用迁移,我想删除迁移消息。

我这样做是因为我创建了继承 ApplicationRecord 的临时类,并且不确定我的 Rails 应用程序的库部分是否正在处理这种元素(在测试中我需要检查它是否适用于 Hash 和 ApplicationRecord)。

仅举个例子,我的库计算存储在记录中的值组的平均值。

在规范的支持下,我添加了一个 model_average.rb 文件,其中包含:

# frozen_string_literal: true

# migration for the model
def model_average_up
  ActiveRecord::Migration.create_table :model_average_data do |t|
    t.integer :v1
    t.float :v2
  end
  ActiveRecord::Migration.create_table :model_average_acc_data do |t|
    t.float :avg_v1
    t.integer :count_v1
    t.float :avg_v2
    t.integer :count_v2
  end
end

def model_average_down
   ActiveRecord::Migration.drop_table :model_average_data
   ActiveRecord::Migration.drop_table :model_average_acc_data
 end

# Test model to compute average on it
class ModelAverageDatum < ApplicationRecord; end

# Test model containing average
class ModelAverageAccData < ApplicationRecord
  def eq?(obj)
    avg_v1 == obj.avg_v1 && count_v1 == obj.count_v1 && avg_v2 == obj.avg_v2 && count_v2 == obj.count_v2
  end
 end

在库的规范文件中,在before(:context)我调用的model_average_up和在after(:context)我调用的model_average_down.

在 rspec 执行期间,它会在点的中间或 test 的文档格式中显示经典的 Migration 输出:

-- create_table(:model_average_data)
   -> 0.0059s
-- create_table(:model_average_acc_data)
   -> 0.0044s

我想删除该输出。可能吗 ?

标签: ruby-on-railsactiverecordrspecverbosity

解决方案


是的,这是可能的,我找到了答案:

只需将迁移代码放在 ActiveRecord::Migration.suppress_messages 参数中给出的块中。

就我而言:

# migration for the model
def model_average_up
  ActiveRecord::Migration.suppress_messages do
    ActiveRecord::Migration.create_table :model_average_data do |t|
      t.integer :v1
      t.float :v2
    end
    ActiveRecord::Migration.create_table :model_average_acc_data do |t|
      t.float :avg_v1
      t.integer :count_v1
      t.float :avg_v2
      t.integer :count_v2
    end
  end
end

def model_average_down
  ActiveRecord::Migration.suppress_messages do
    ActiveRecord::Migration.drop_table :model_average_data
    ActiveRecord::Migration.drop_table :model_average_acc_data
  end
end

然后它就消失了!


推荐阅读