我有一个 rake 任务,填充一些初始数据在我的轨道应用程序。例如,国家、州、移动运营商等。
我现在设置它的方式是,在/db/fixture 中的文件中有一堆 create 语句,并且有一个 rake 任务来处理它们。例如,我有一个模型是主题。我在/db/fixture 中有一个 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 无效。这意味着如果我决定添加一个主题,让我们称之为“ Red”,那么我只需要将主题语句添加到这个 fixture 文件中,并调用 rake 任务重新播种数据库。如果我这样做,因为主题属于其他对象,并且在重新初始化时它们的 id 发生了变化,所有链接都会中断。
我的问题首先是,这是处理数据库种子化的好方法吗?在之前的一篇文章中,有人建议我这样做。
如果是这样,我如何硬编码的 ID,并有任何缺点呢?
如果没有,那么在数据库中添加种子的最佳方法是什么?
我将真正欣赏长期和深思熟虑的答案,纳入最佳做法。