代码之家  ›  专栏  ›  技术社区  ›  sameera207

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

  •  1
  • sameera207  · 技术社区  · 14 年前

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

    1-创建SQL脚本

    2-创建迁移

    3-创建rake任务

    4-其他(请解释)

    提前谢谢

    干杯

    萨梅拉

    2 回复  |  直到 14 年前
        1
  •  0
  •   John Topley    14 年前

    看一看 seed-fu .

        2
  •  0
  •   Alexey Chernikov    14 年前

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

    我更喜欢从fixture加载数据,因为fixture可以在稍后的测试中使用。我使用的是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