2011-12-11 66 views
3

我正在阅读Dan Chak的Enterprise Rails Book - Great Book。在本书中,他讨论了域表或查找表,并建议通过向模式定义添加插入语句来创建这些表 - 因为这些表不太可能改变。这本书之前seeds.rb文件的来临写的,所以我的问题(S)如下:什么是在rails中创建域表(查找表)的首选方式

  1. 鉴于种子文件是否存在,是否最好/最好使用的种子文件来创建域表或者最好是使用插入语句到模式定义。

  2. 如果插入语句仍然是可取的,那么只需要输入插入语句,然后运行db:rake migrate。

+1

这里的我们指的是这个概念:http://enterpriserails.chak.org/full-text/chapter-7-domain-data – Docunext

回答

1

我有同样的问题,并发现这个网页寻找如何解决它。

我不认为它是最好的解决方案,但我最终使用find_or_create_by ...将模型放入模型中,因为我无法弄清楚如何在模型安装之前填充种子数据试验。

0

在测试过程中,使用find_or_create_by将域数据放入模型中对我造成了一些问题。我相信问题是数据被插入并且在测试的db事务中定义了所有的常量。在测试示例之后,db事务回滚,留下仍然实例化的常量指向不再存在的记录。

所以我把域数据放入seeds.rb。为了防止这种情况Docunext笔记,模型实例化的问题,之前的数据是在数据库中,我使用原始SQL的插入,因为这样的:

# in db/seeds.rb 
    ActiveRecord::Base.connection.execute "INSERT INTO invoice_statuses(name) values ('Approved'), ('Sent'), ('Paid');" 

我配置database_cleaner宝石跳过所有域表在测试之间清理出当数据库:

# 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 
相关问题