对于我的一个模型,我有一些应该自动填充的实例。我该如何处理?

时间:2009-01-28 20:56:08

标签: ruby-on-rails ruby database model constants

我必须明确这一点才有意义。在我的应用程序中,我有一个名为theme的模型,其中包含widget颜色主题信息。我们提供了一些主题,但主要依靠用户创建自己的主题。所以问题是:我在哪里存储我的主题?如果我将它们存储在主题数据库中,那么无论何时我在切换数据库或在测试期间刷新它,我都必须重新输入主题。这不是一个大问题,它只是看起来很草率。

现在我将主题存储在控制器中的Hash中。问题是因为每个小部件都有一个主题,每个小部件都有一个theme_id,并且我们提供的主题没有theme_id,因为它们没有存储在数据库中。

我知道这个问题的解决方案非常简单,但我想确保我的解决方案采用最佳编码方法。有人对此有任何建议吗?也许有一种方法可以在迁移或其他rake任务期间将条目添加到数据库中......

谢谢!

3 个答案:

答案 0 :(得分:4)

在迁移中加载种子数据是最有意义的,也是我经常做的事情。如果创建前几条记录确实是表的正确初始化的一部分,即如果您的表根本不会在没有它们的应用程序中完成您需要的工作,那么它们就属于迁移。 Rake任务非常适合捕获需要在命令中加载到应用程序中的数据集(例如,用于演示),但如果一直需要某些记录,则迁移就是现场。

答案 1 :(得分:3)

主题数据属于数据库。

要进行测试,请使用fixture或setup方法初始化主题数据。对于开发和生产,您应该创建一种使用初始主题数据为数据库设定种子的方法。自定义Rake任务对此有利。实际的主题数据可以以任何您希望的格式存储。例如SQL脚本或YML fixtures

我使用以下Rake任务使用db / seeddata中的SQL文件中保存的数据为数据库设定种子(将其放在项目的/ lib目录下的.rake文件中):

namespace :db do
  desc "Load seed fixtures (from db/seeddata) into the current environment's database." 
  task :seed => :environment do
    require 'yaml'
    config = YAML::load(open("#{RAILS_ROOT}/config/database.yml"))["#{RAILS_ENV}"]
    Dir.glob(RAILS_ROOT + '/db/seeddata/*.sql').each do |file|
      cmd = "mysql -u #{config['username']} -p#{config['password']} -h #{config['host']} #{config['database']} < #{file}"
      `#{cmd}`
    end
  end
end

答案 2 :(得分:1)

你想要播种数据的想法似乎是要走的路。我喜欢你提出的方法,但你怎么看待这里提出的方法: http://railspikes.com/2008/2/1/loading-seed-data

它建议您让ActiveRecord处理种子数据,以便它可以验证数据。

您认为哪个更好?

再次感谢!