如何禁用ActiveRecord :: Migration详细程度?

时间:2018-04-27 16:27:30

标签: ruby-on-rails activerecord rspec verbosity

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

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

Longuer版本:

我在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_upafter(:context)呼叫model_average_down

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

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

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

2 个答案:

答案 0 :(得分:0)

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

只需将迁移代码放在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

然后它就消失了!

答案 1 :(得分:0)

您还可以在运行迁移之前执行ActiveRecord::Migration.verbose = false。这样,您就无需使用该块。拥有选项真好。