我有一个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无效。这意味着如果我决定添加一个主题,让我们称之为“红色”,那么我只想将主题语句添加到此fixture文件并调用rake任务来重新设置数据库。如果我这样做,因为主题属于其他对象,并且在重新初始化时它们的id发生了变化,所有链接都会被破坏。
我的问题首先是,这是处理种子数据库的好方法吗?在之前的帖子中,我向你推荐了这个。
如果是这样,我怎样才能对ID进行硬编码,这有什么缺点吗?
如果没有,那么为数据库设定种子的最佳方式是什么?
我将真正感谢包含最佳实践的长期思考答案。
答案 0 :(得分:108)
更新,因为这些答案有点过时(虽然有些仍然适用)。
rails 2.3.4,db / seeds.rb
中添加了简单的功能提供新的佣金任务
rake db:seed
适合填充州,国家等常见静态记录......
http://railscasts.com/episodes/179-seed-data
*请注意,如果你已经创建了fixtures,你也可以通过将以下内容放入seeds.rb文件(来自railscast剧集)中来填充db:seed任务:
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")
答案 1 :(得分:26)
通常需要2种种子数据。
根据我的经验,我总是需要这两种类型的数据。所以我把a small gem that extends Rails' seeds放在一起,让你在db / seeds /下添加多个公共种子文件,在db / seeds / ENV下添加任何环境种子数据,例如db / seeds / development。
我发现这种方法足以为我的种子数据提供一些结构,并且让我能够通过运行来在已知状态下设置我的开发或登台环境:
rake db:setup
固定装置易于维护和保存,正常的sql转储也是如此。
答案 2 :(得分:25)
factory_bot听起来会像你想要的那样做。您可以在默认定义中定义所有公共属性,然后在创建时覆盖它们。您也可以将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
答案 3 :(得分:21)
使用seeds.rb
文件或FactoryBot
非常棒,但它们分别适用于固定数据结构和测试。
seedbank
宝石可能会为您的种子提供更多控制和模块化。它插入rake任务,您还可以定义种子之间的依赖关系。你的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
答案 4 :(得分:1)
Rails有一种内置的种子数据方式,如here所述。
另一种方法是使用宝石进行更高级或更容易的播种,例如:seedbank。
这个gem的主要优点和我使用它的原因是它具有高级功能,如数据加载依赖项和每个环境种子数据。
添加最新答案,因为此答案最初是在Google上进行的。
答案 5 :(得分:-3)
最好的方法是使用灯具。
注意:请记住,灯具会直接插入并且不使用您的模型,因此如果您有填充数据的回调,则需要找到解决方法。
答案 6 :(得分:-3)
在数据库迁移中添加它,这样每个人都可以在更新时获取它。处理ruby / rails代码中的所有逻辑,因此您永远不必弄乱显式ID设置。