在rails中创建域表(查找表)的首选方法是什么

时间:2011-12-11 17:50:41

标签: ruby-on-rails ruby-on-rails-3

我正在阅读Dan Chak的Enterprise Rails Book - Great Book。在本书中,他讨论了域表或查找表,并建议通过向模式定义添加insert语句来创建这些表 - 因为表不太可能更改。这本书是在seeds.rb文件出现之前编写的,所以我的问题如下:

  1. 鉴于种子文件的存在,使用种子文件创建域表是优选/更好还是最好使用插入语句来进行模式定义。

  2. 如果仍然更喜欢insert语句,那么只需输入insert语句然后运行db:rake migrate。

2 个答案:

答案 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