2009-01-29 48 views

Trả lời

24

Có một nhiệm vụ cào cho việc này. Bạn có thể chỉ định RAILS_ENV nếu cần; mặc định là môi trường phát triển:

rake db:fixtures:dump 
    # Create YAML test fixtures from data in an existing database. 
+2

db: đồ đạc: đổ trên Rails? Tôi không thấy nó trên 2.3.5. – Pablo

+4

có vẻ như nó đã được trích xuất từ ​​ActiveRecord. Bạn có thể thêm lại nó bằng plugin này: http://github.com/topfunky/ar_fixtures Sau đó chạy: rake db: fixtures: dump MODEL = ModelName –

+0

tính năng này chỉ hợp lệ cho Rails 3. – fotanus

21

Tôi đã sử dụng YamlDb để lưu trạng thái cơ sở dữ liệu của mình.

Install nó với lệnh sau:

script/plugin install git://github.com/adamwiggins/yaml_db.git 

Sử dụng các nhiệm vụ cào để đổ nội dung của cơ sở dữ liệu Rails để db/data.yml

rake db:data:dump 

Sử dụng nhiệm vụ cào để tải nội dung của db/data.yml vào cơ sở dữ liệu

rake db:data:load 

Đây là trang chủ của người sáng tạo:

http://blog.heroku.com/archives/2007/11/23/yamldb_for_databaseindependent_data_dumps/

+3

Các kho hiện đang duy trì hiện tại là http://github.com/ludicast/yaml_db – Sney

+1

Làm cách nào để có thể nhắm mục tiêu một bảng để đổ, thay vì bán toàn bộ db? –

2

rake db:fixtures:dump

đã được thay đổi để

rake db:extract_fixtures

+1

+ hoàn hảo, Cảm ơn vì điều này. – Jirapong

+1

Phiên bản đường ray nào? điều này dường như không đúng với 2.x, mà câu hỏi được đặt ra. có lẽ câu trả lời của bạn là cụ thể cho đường ray 3.x? – tehgeekmeister

+3

Nó không có trong vanilla Rails 3.x. – Turadg

9

Plugin này sẽ bổ sung thêm các chức năng mà bạn muốn. Nó được trích xuất từ ​​ActiveRecord do đó không còn theo mặc định nữa.

script/plugin install http://github.com/topfunky/ar_fixtures

Sau đó chạy:

rake db:fixtures:dump MODEL=ModelName

6

Đối với Rails 3, nếu bạn muốn để đổ yaml từ DB và sử dụng nó như một vật cố, tôi sử dụng mã này:

module DbToFixture 

    TEMP_FIXTURE_PATH = Rails.root.join("test", "new_fixtures") 

    def fixturize(model) 
    Dir.mkdir(TEMP_FIXTURE_PATH) unless File.exists?(TEMP_FIXTURE_PATH) 
    fname = model.table_name 
    file_path = TEMP_FIXTURE_PATH.join(fname) 
    File.open(file_path, 'w') do |f| 
     model.all.each do |m| 
     f.write(m.to_yaml) 
     end 
    end 
    end 

end 

Tôi chỉ chạy nó từ bảng điều khiển với

require './lib/db_to_fixture' 
include DbToFixture 
fixturize ModelName 

Tôi đã không thể có được ar_fixtures để làm việc với Rails 3 (đã không cố gắng rất khó khăn mặc dù). Yaml db là tuyệt vời cho việc đổ và lưu db, nhưng định dạng của nó không tương thích với các đồ đạc.

+0

Tôi có phải đặt tên tệp là db_to_fixture không? Rails tuyệt vời không có lệnh đơn giản để thực hiện trong các đường ray mới nhất. Đây là điều tôi cần phải làm thường xuyên. –

+0

Thật tuyệt vời. Trong mọi trường hợp, có, nó phải là trường hợp con rắn của bất kỳ module nào được gọi. – jpgeek

1

Dưới đây là một nhiệm vụ cào mà sẽ làm chính xác điều đó (thử nghiệm trong Rails 3.2.8):

namespace :db do 
    task :extract_fixtures => :environment do 
     sql = 'SELECT * FROM "%s"' 
     skip_tables = ["schema_migrations"] 
     ActiveRecord::Base.establish_connection 
     if (not ENV['TABLES']) 
     tables = ActiveRecord::Base.connection.tables - skip_tables 
     else 
     tables = ENV['TABLES'].split(/, */) 
     end 
     if (not ENV['OUTPUT_DIR']) 
     output_dir="#{Rails.root}/test/fixtures" 
     else 
     output_dir = ENV['OUTPUT_DIR'].sub(/\/$/, '') 
     end 
     (tables).each do |table_name| 
     i = "000" 
     File.open("#{output_dir}/#{table_name}.yml", 'w') do |file| 
      data = ActiveRecord::Base.connection.select_all(sql % table_name.upcase) 
      file.write data.inject({}) { |hash, record| 
      hash["#{table_name}_#{i.succ!}"] = record 
      hash 
      }.to_yaml 
      puts "wrote #{table_name} to #{output_dir}/" 
     end 
     end 
    end 
end 

Nguồn: http://sachachua.com/blog/2011/05/rails-exporting-data-specific-tables-fixtures/

Lưu ý: Tôi đã phải thực hiện một vài thay đổi mã blog để làm cho nó tương thích với nhiều cơ sở dữ liệu hơn và làm việc trong Rails 3.2

+0

Kịch bản hay. Tôi đã phải loại bỏ '.upcase' để làm cho nó hoạt động trong Rails 4 nhưng nếu không, nó hoạt động như quảng cáo. Cảm ơn. –

4

Iron Fixture Extractor được xây dựng cho mục đích này chính xác. Nó đặc biệt tốt cho các tình huống mà bạn muốn sử dụng các bộ cố định khác nhau cho các kịch bản thử nghiệm khác nhau (thay vì có tất cả các đồ đạc cho tất cả các thử nghiệm). Nó cung cấp chức năng để giải nén, tải, xây dựng lại đồ đạc, cắt bớt bảng, hoặc snagging băm đặc biệt từ tập tin yaml lịch thi đấu của bạn.

+0

Cảm ơn bạn đã giới thiệu tuyệt vời này. Tôi thấy nó đặc biệt hữu ích vì nó cho phép tôi trích xuất một phần dữ liệu cho mục đích thử nghiệm trên một bảng khá lớn. – smile2day

0
> rails c 
irb> puts Modelname.all.to_yaml 

dán vào tệp và chỉnh sửa để phù hợp với nội dung mong đợi.

Đó là lao động thủ công nhưng nếu bạn cần điều này chỉ một lần có thể là cách nhanh nhất.

+1

Dường như không hoạt động trên Rails 4. –

Các vấn đề liên quan