【问题标题】:How do I create a persistent table in a Rails app's test database?如何在 Rails 应用程序的测试数据库中创建持久表?
【发布时间】:2009-11-17 01:28:55
【问题描述】:

我有一个引用 TMY3 meteorological dataset 的 rails 应用程序,它是对 1000 多个不同站点的大量不同的每小时天气观测。

我下载了整个数据集并将我需要的列吸进了一个按站点索引的本地表中,这使得它在开发和生产中变得又好又快。

但是,索引需要 5 分钟,这使得每次加载测试都非常痛苦。这个表永远不会改变,所以我想把它加载到我的测试环境中,然后把它放在那里运行我的其余测试。我所有的其他模型和表格都是标准的轨道交易,可以根据需要进行工厂化或模拟。

有什么想法吗?

【问题讨论】:

  • 您是否使用 db:seed 播种?您如何加载这些数据进行测试?
  • 我不知道 db:seed - 现在我只是没有加载(或测试)那个全新的模型。我通过将以前的 mysqldumped 文件通过管道传输到 mysql 来将表加载到我的开发和生产环境中。

标签: ruby-on-rails


【解决方案1】:

对于不需要在测试时拆掉的模型,将其放在单独的数据库中进行测试。只有从 database.yml 加载的测试数据库会从开发数据库的架构中清除和重建。

class PersistModel < ActiveRecord::Base
    PersistModel.establish_connection(
       :adapter  => "sqlite3",
       :database => "db/persist.sqlite3"
    )
end

这个类永远不会清除它的数据库。

您可能会发挥创造力,并拥有一个建立不同连接的真实模型的测试版本。

class WeatherTest < Weather
    WeatherTest.establish_connection(
       :adapter  => "sqlite3",
       :database => "db/weather.sqlite3"
    )
end

这样,“真实”模型中的所有功能都可用于您的测试版本。

【讨论】:

  • 这绝对是一种优雅的方式,但我需要将持久表加入几个非持久表。
【解决方案2】:

您可能会查看this question about db:test:prepare 是否适用于您的情况。

【讨论】:

  • 我最终采用了这种方法 - 实际上覆盖了 db:test:purge 并单独删除每个非持久表,而不是删除整个数据库并重新创建它。有一点额外的复杂性,因为我现在必须弄清楚如何从 schema.rb 中获取持久性数据库,或者至少不在测试环境中加载。
  • 后续问答:stackoverflow.com/questions/1752667/… 基本上,必须在 environment.rb 中添加以下行:ActiveRecord::SchemaDumper.ignore_tables = ["table_name"]
【解决方案3】:

我自己没有尝试过,但是其中一个缓存插件可以提供解决方案吗? Advanced Caching - from the Rails Guides

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多