【发布时间】:2014-08-18 16:58:49
【问题描述】:
我有一个使用 PostgreSQL 9.1 作为数据库的 Rails 3 应用程序。我们使用 RSpec 和 FactoryGirl 进行测试。
数据模型有很多一对多或多对多关系的模型,这些约束在 Rails 模型中使用 has_many、belongs_to、has_many :through 等进行编码。我们的代码看起来像:
class User < ActiveRecord::Base
attr_accessible :name
has_many :phones
end
class Phone < ActiveRecord::Base
attr_accessible :number, user_id
belongs_to :user
end
PostgreSQL 中的模式看起来像这样
CREATE TABLE users (id integer, name VARCHAR(20));
CREATE TABLE phones (id integer, number VARCHAR(20), user_id integer);
但是,我更喜欢使用外键约束而不是仅在模型中对数据库中的数据约束进行编码。为此,我创建了一个 Rails 迁移并添加了外键约束,如下所示:
sql = "ALTER TABLE phones ADD CONSTRAINT phones_user_id FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE RESTRICT;"
ActiveRecord::Base.connection.execute(sql)
当我添加外键约束并在开发模式下启动应用程序时,数据库强制执行约束,如果用户有任何依赖电话,我无法删除它。无论我是在“psql”PostgreSQL 控制台还是 IRB Rails 控制台中,这都是正确的。
但是,当我尝试编写 RSpec 测试以查看外键是否强制删除限制时,测试失败并且我能够删除具有相关电话的用户。显然,“rake db:test:prepare”不会使用外键准备数据库。
有没有一种方法可以针对强制外键约束的数据库运行我的 RSpec 测试套件?
【问题讨论】:
标签: ruby-on-rails postgresql rspec foreign-keys rspec-rails