在rails中将默认值加载到数据库的最佳实践

时间:2010-08-10 06:40:56

标签: ruby-on-rails

我有一个rails项目,我需要在数据库表中添加一些默认值。我想知道这些最好的方法(我使用rails 2.3.3没有seed.rb文件:()

1 - 创建sql脚本

2 - 创建迁移

3 - 创建佣金任务

4 - 其他(请解释)

提前致谢

欢呼声

sameera

2 个答案:

答案 0 :(得分:0)

看看seed-fu

答案 1 :(得分:0)

在当前稳定版本的Rails(2.3.8)中,有rake task db:seed,它在db / seeds.rb文件中执行代码。在该文件中,您可以通过直接执行Rails代码(News.create:title =>“test”...)来加载数据,或者使用您喜欢的任何其他方法。

我更喜欢从灯具加载数据,因为灯具可以在以后的测试中使用。我正在使用rspec,所以我的灯具存储在spec / fixtures /目录中。

您可以使用下一代码从现有的sql表中制作灯具:

def make_fixtures(tablenames, limit = nil)
  sql = "SELECT * FROM %s"
  sql += " LIMIT #{limit}" unless limit.nil?
  dump_tables = tablenames.to_a
  dump_tables.each do |table_name|
    i = "000"
    file_name = "#{RAILS_ROOT}/spec/fixtures/#{table_name}.yml"
    puts "Fixture save for table #{table_name} to #{file_name}"
    File.open(file_name, 'w') do |file|
      data = ActiveRecord::Base.connection.select_all(sql % table_name )
      file.write( data.inject({}) do |hash, record|
        hash["#{table_name}_#{i.succ!}"] = record
        hash
      end.to_yaml )
    end
  end
end

在db / seeds.rb中,您可以从灯具加载:

require 'active_record/fixtures'

[ "classifiers", "roles", "countries", "states", "metro_areas" ].each do |seed|
  puts "Seeding #{seed}..."
  Fixtures.create_fixtures(File.join(Rails.root, "spec", "fixtures"), seed)
end