我正在阅读Dan Chak的Enterprise Rails Book - Great Book。在本书中,他讨论了域表或查找表,并建议通过向模式定义添加insert语句来创建这些表 - 因为表不太可能更改。这本书是在seeds.rb文件出现之前编写的,所以我的问题如下:
鉴于种子文件的存在,使用种子文件创建域表是优选/更好还是最好使用插入语句来进行模式定义。
如果仍然更喜欢insert语句,那么只需输入insert语句然后运行db:rake migrate。
答案 0 :(得分:1)
我有同样的问题,并发现此页面正在寻找其他人如何解决它。
我不认为它是最好的解决方案,但我最终使用find_or_create_by ...将域数据放入模型中,因为我无法弄清楚如何在测试期间模型实例化之前填充种子数据
答案 1 :(得分:0)
使用find_or_create_by
将域数据放入模型中会在测试期间给我带来一些问题。我认为问题是在测试的db事务期间插入了数据并且常量定义了全部。在测试示例之后,db事务被回滚,使仍然实例化的常量指向不再存在的记录。
所以我将域数据放入seeds.rb
。为了防止Docunext注意到的问题,在数据在db之前实例化的模型,我使用原始SQL作为插入,如下:
# in db/seeds.rb
ActiveRecord::Base.connection.execute "INSERT INTO invoice_statuses(name) values ('Approved'), ('Sent'), ('Paid');"
我将database_cleaner gem配置为在两次测试之间清理数据库时跳过所有域表:
# in spec/support/database_cleaner.rb
RSpec.configure do |config|
domain_data = %w[aql_results invoice_statuses service_results remark_types]
config.before(:suite) do
DatabaseCleaner.strategy = :deletion, { except: domain_data }
DatabaseCleaner.clean
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :deletion, { except: domain_data }
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end