我有一个rake任务在我的Rails应用程序中填充一些初始数据,例如国家、州、移动运营商等。
现在的设置方式是,在/db/fixtures目录下有一堆创建语句的文件和一个处理它们的rake任务。例如,我有一个模型是themes。我在/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,并且是否存在任何缺点?
如果不是,那么最佳的种子数据库方法是什么?
我真的很感激融合最佳实践的长而深思熟虑的答案。