我有一个应用程序需要在几个表上使用 MyISAM,但其余的都是传统的 InnoDB 类型。应用程序本身不关心它应用于这些记录的事务,但性能是一个问题。
不过,Rails 测试环境假定使用的引擎是事务性的,因此当从 schema.rb 生成测试数据库时,它会使用相同的引擎导入。是否有可能以简单的方式覆盖此行为?
我采取了一种可怕的技巧,通过将其附加到 test_helper.rb 来确保表的类型正确:
(ActiveRecord::Base.connection.select_values("SHOW TABLES") - %w[ schema_info ]).each do |table_name|
ActiveRecord::Base.connection.execute("ALTER TABLE `#{table_name}` ENGINE=InnoDB")
end
是否有更好的方法使 MyISAM 支持的模型可测试?
最佳答案
您可以编辑 schema.rb 并修改 create_table 调用以包含以下标志,如下所示:
create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')
当您创建迁移时,请尝试将其添加到迁移中。我不知道当你运行 rake db:schema:dump 时这是否会持续。根据您的经验,测试环境似乎没有正确复制开发环境,它可能不会:(
更多关于 create_table 选项的信息:
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001901
关于mysql - 使用 MyISAM 表进行 Rails 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2616173/