【问题标题】:Rails fixtures with multiple databases具有多个数据库的 Rails 夹具
【发布时间】:2012-01-09 17:20:29
【问题描述】:

我正在尝试将测试装置添加到使用多个数据库的 rails (v 3.1.3) 应用程序。 夹具应仅应用于应用程序自己的测试 sqlite 数据库:

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

另外 2 个数据库是 mysql,也有名为 %dbname%_test 的测试实例,并且已经填充了测试数据。

在我添加了固定装置后,我的所有测试都因“ActiveRecord::StatementInvalid: Mysql::Error: Unknown column”错误而失败,因为 rails 正在尝试将固定装置应用于 mysql 数据库之一。

有没有办法指定一个夹具是为哪个数据库制作的?

【问题讨论】:

    标签: ruby-on-rails fixtures multiple-databases


    【解决方案1】:

    Fixtures-init 代码(在 activerecord-3.2.6/lib/active_record/fixtures.rb 中)有一个 bug:在“initialize”方法中,在第 544 行的“else”中,@connection 需要初始化为@model_class.connection。 (否则,@connection 只是指向错误数据库的“连接”。)

    【讨论】:

    • 谢谢您——Ruby on Rails 跟踪器中是否存在相应的错误(即,他们是否知道这一点)?
    • jgoldschrafe:AFAICT,看起来它已在当前 ActiveRecord 中修复,第 519 行:@connection = (model_class.respond_to?(:connection) ? model_class.connection : connection)
    • @aqn:实际上,我仍然看到SQLite3::SQLException: no such table: 错误。不确定它是否仍然损坏或我做错了什么。
    • 我目前能够使用@tee 的答案(activerecord 4.1.4)中描述的方法将夹具加载到不同的数据库中
    【解决方案2】:

    在 database.yml 中,为每个环境的每个其他数据库添加一个连接:

    other_one_test:
      adapter: mysql
      # ...
    
    other_two_test:
      # ...
    
    other_one_development:
      # ...
    
    other_two_development:
      # ...
    

    在使用其他数据库的模型中,使用

    连接到它们
    establish_connection("other_one_test")
    

    您可能希望为每个不同的数据库连接创建一个基类模型,并将其用于连接到该数据库的所有模型:

    class OtherOneBase < ActiveRecord::Base
      establish_connection "other_one_#{Rails.env}"
    end
    
    class SomeModel < OtherOneBase
    end
    

    如果您正确设置模型,您的夹具将使用正确的数据库。

    【讨论】:

    • 这正是我的数据库/模型的设置方式,并且确实是在 Rails 中执行此操作的唯一实用方法,但它只是不起作用。最后,我摆脱了其中一个 mysql 数据库并转而使用应用程序 API(我以前选择直接使用数据库以获得更好的性能)并用工厂的替换固定装置。
    • 我目前可以使用这种方法将夹具加载到不同的数据库中(activerecord 4.1.4)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多