在Rails中build立数据库的最佳方式是什么?

我有一个Rake任务,填充我的Rails应用程序中的一些初始数据。 例如,国家,州,移动运营商等

我现在设置的方式是,我在/ db / fixtures文件中有一堆create语句和一个处理它们的rake任务。 例如,我有一个模型是主题。 在/ db / fixtures中有一个theme.rb文件,如下所示:

Theme.delete_all Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222', :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000', :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF', :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true) Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF', :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF', :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000', :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true) Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374', :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000', :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000', :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true) puts "Success: Theme data loaded" 

这里的想法是,我想为用户开始安装一些股票主题。 我有这个方法的问题。

设置ID不起作用。 这意味着,如果我决定添加一个主题,我们称之为“红色”,那么我只想将主题语句添加到该夹具文件中,并调用rake任务来重新设置数据库。 如果我这样做,因为主题属于其他对象,并且在这个重新初始化时它们的id发生了变化,所有的链接都被破坏了。

我的问题首先是处理播种数据库的好方法吗? 在之前的文章中,这是向我推荐的。

如果是这样,我怎样才能硬编码的ID,有什么缺点呢?

如果不是,种子数据库的最佳方法是什么?

我将真正感激长时间,并考虑到最佳做法的答案。

由于这些答案略有过时(尽pipe有些仍然适用)。

简单的function添加在轨道2.3.4,db / seeds.rb

提供一个新的rake任务

 rake db:seed 

适合填充常见的静态logging,如状态,国家等…

http://railscasts.com/episodes/179-seed-data

*请注意,如果您已经创build了它们,还可以使用fixtures来填充db:seed任务,方法是在您的seeds.rb文件(从railscast插曲)中放入以下内容:

 require 'active_record/fixtures' Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems") 

对于Rails 3.x,使用“ActiveRecord :: Fixtures”而不是“Fixtures”常量

 require 'active_record/fixtures' ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name") 

factory_girl听起来像它会做你正在努力实现的。 您可以在默认定义中定义所有常用属性,然后在创build时覆盖它们。 您也可以将ID传递给工厂:

 Factory.define :theme do |t| t.background_color '0x000000' t.title_text_color '0x000000', t.component_theme_color '0x000000' t.carrier_select_color '0x000000' t.label_text_color '0x000000', t.join_upper_gradient '0x000000' t.join_lower_gradient '0x000000' t.join_text_color '0x000000', t.cancel_link_color '0x000000' t.border_color '0x000000' t.carrier_text_color '0x000000' t.public true end Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5') Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5') Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC') 

当与faker一起使用时,它可以快速地使用关联来填充数据库,而不必与Fixtures(yuck)混淆。

我在rake任务中有这样的代码。

 100.times do Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)]) end 

通常需要2种种子数据。

  • 您的应用程序的核心可能依赖的基本数据 。 我把这称为共同的种子。
  • 环境数据 ,例如开发应用程序,有一堆数据处于已知状态,我们可以用来在本地处理应用程序(上面的Factory Girl答案涵盖了这种数据)是非常有用的。

根据我的经验,我总是遇到需要这两种types的数据。 所以我放了一个扩展Rails的种子的小gem,让你在db / seeds /下添加多个常见种子文件,在db / seeds / ENV下添加任何环境种子数据,例如db / seeds / development。

我发现这种方法足以给我的种子数据一些结构,并给我力量来build立我的开发或登台环境在一个已知的状态,只要运行:

 rake db:setup 

像常规的SQL转储那样,灯具是脆弱的,并且要维护。

使用seeds.rb文件或FactoryGirl是伟大的,但这些分别是伟大的固定数据结构和testing。

seedbankgem可能会给你更多的控制和模块化给你的种子。 它插入rake任务,你也可以定义种子之间的依赖关系。 您的耙子任务列表将有这些添加(例如):

 rake db:seed # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env. rake db:seed:bar # Load the seed data from db/seeds/bar.seeds.rb rake db:seed:common # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb. rake db:seed:development # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb. rake db:seed:development:users # Load the seed data from db/seeds/development/users.seeds.rb rake db:seed:foo # Load the seed data from db/seeds/foo.seeds.rb rake db:seed:original # Load the seed data from db/seeds.rb 

而不是使用显式创build,而是使用YAML文件。 用简单的语法,你可以填写一个对象的所有值。 实际上,如果您对轨道testing有所了解,那么这是testing数据库的标准方法。 看看这些网页:
http://railspikes.com/2008/2/1/loading-seed-data http://quotedprintable.com/2007/11/16/seed-data-in-rails

将其添加到数据库迁移中,这样每个人都可以在更新时获得它。 在ruby / rails代码中处理所有的逻辑,所以你永远不必搞乱显式的ID设置。

Rails有一个内置的数据种子的方式, 这里解释。

另一种方法是使用gem更先进或容易播种,如: 种子库 。

这个gem的主要优点和我使用它的原因是它具有诸如数据加载依赖性和每个环境种子数据的高级function。

添加一个最新的答案,因为这个答案是第一次在谷歌。

最好的方法是使用灯具。

注意:请记住,灯具做直接插入,不要使用你的模型,所以如果你有callback填充数据,你将需要find一个解决方法。