【问题标题】:Dependency on fixture data in rails initializerRails 初始化程序中对夹具数据的依赖
【发布时间】:2010-10-08 10:18:37
【问题描述】:

我有一个初始化程序,它设置了在整个应用程序中使用的默认值。该值是一个 ActiveRecord 模型,我实际上是在应用程序的生命周期内缓存它:

@@default_region = Region.find_by_uri("whistler")

记录保证在数据库中:它是被其他模型引用的夹具数据。这工作正常,除非在每次测试运行之前清除数据库的测试环境中。 (我在边缘轨道上运行,我认为这是最近的行为:我曾经能够手动插入数据并在测试运行之间保留它。)我的 regions.yml 夹具文件中也有记录,但夹具不是' t 加载,直到 rails 初始化程序完成。

处理这种对夹具数据的依赖的正确方法是什么?或者有没有更好的方法来构建它?我宁愿不使用 before_filter,因为在每个请求上重新加载它是没有意义的:它不会改变,除非在不同的部署中。

【问题讨论】:

    标签: ruby-on-rails testing dependencies fixtures initializer


    【解决方案1】:

    对 Ruby 或 Rails 不是很熟悉...但是您为什么不尝试“延迟加载”方案呢?基本上,有一个全局函数来检查数据是否已加载,如果没有,则从数据库中获取它,然后缓存它。如果它已经被缓存了,就返回它。

    这样,在第一次调用该函数之前,您不会尝试访问数据库,并且到那时一切都应该被初始化。

    【讨论】:

    • 在测试环境中,数据库会被清除,因此此时无需从数据库中进行延迟加载。如果它不存在,我将不得不从文件中将其加载到数据库中。
    • 我以为你说过在 rails 初始化程序完成后会加载固定装置。我错过了什么吗?
    • 是的,测试序列是这样工作的:运行rake test 清除数据库; rails 初始化(这是我遇到依赖的地方);然后为测试环境加载夹具。
    【解决方案2】:

    我会在 region.rb 中添加这样的内容:

    def self.default_region
      @@default_region ||= Region.find_by_uri("whistler")
    end
    

    然后,您可以在任何需要的地方以 Region.default_region 的形式访问它,并且只查找一次 - 第一次调用它时 - 到那时,固定装置就会到位。

    【讨论】:

    • 非常好的解决方案...摆脱了整个依赖。一切最终都会转移到模型中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多