2011-08-08 29 views
13

Làm cách nào để sử dụng tệp YAML thay vì seed.rb để tải dữ liệu ban đầu vào cơ sở dữ liệu?Ruby on Rails: tải dữ liệu hạt giống từ tập tin YAML

+0

Thấy câu trả lời được chấp nhận không tốt (đặt dữ liệu hạt giống trong thư mục 'test /') và [câu trả lời của tôi] (http://stackoverflow.com/a/24957205/405550) đã có nhiều upvotes đáng kể hơn, bạn có vui lòng xem xét chấp nhận của tôi không? – Zaz

Trả lời

3

Check-out Ruby on Rails Hướng dẫn đồ đạc:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

Nói chung, bạn có thể tạo các file cố YAML trong thư mục test/ và sau đó tải chúng vào cơ sở dữ liệu của bạn bằng cách sử dụng lệnh rake db:fixtures:load. Các tài liệu đầy đủ về tất cả những điều tuyệt vời bạn có thể làm với trang thiết bị như ở đây:

http://api.rubyonrails.org/classes/Fixtures.html

+3

Điều tương tự có hoạt động cho phát triển hoặc sản xuất không? – fijiaaron

+1

Liên kết cuối cùng bị hỏng. Ngoài ra, tải dữ liệu hạt giống từ 'test /' dường như không đúng cách để làm việc. – Zaz

+0

Nó cũng khiến tôi cảm thấy không thoải mái, nhưng trong thực tế một số người sử dụng đồ đạc để điền dữ liệu cho mục đích thử nghiệm. Có các tập tin giống yaml giống nhau ở hai nơi cảm thấy thậm chí còn nhiều hơn ... icky. – jaydel

19

Thêm mã trong db/seeds.rb để phân tích các file YAML, ví dụ:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

Sau đó, chỉ cần đặt YAML fie in db/seeds/categories.yml. Các file YAML phải là một danh sách các mảng kết hợp, ví dụ .:

- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

Vấn đề với giải pháp này là nếu bạn chạy 'rake db: seed' một giây thời gian, bạn sẽ nhận được một loạt các bản sao. Tùy thuộc vào yêu cầu về tính duy nhất, có thể bạn sẽ muốn sửa đổi dòng cuối cùng thành một cái gì đó như: 'config.each {| values ​​| Category.first_or_create (values)} ' – sberkley

+0

Trong trường hợp nào bạn muốn nhân cơ sở dữ liệu hai lần? 'rake db: reset' làm mọi thứ bạn cần 99% thời gian. – Zaz

+2

Nếu bạn thêm các giá trị giống mới vào bảng hoặc thêm một bảng mới với các giá trị được chọn. Việc bỏ toàn bộ cơ sở dữ liệu có thể là một giải pháp trong môi trường phát triển, nhưng chắc chắn không phải là trong sản xuất. Thả bảng giống trước khi tái gieo giống cũng không phải là một tùy chọn nếu có bất kỳ tham chiếu nào đến các id của bảng đó trong một bảng khác. Nếu bạn cần phải loại bỏ các giá trị hạt giống trước đó, tình huống trở nên phức tạp hơn và có thể yêu cầu một giải pháp vượt quá 'rake db: seed'. – sberkley

2

tôi đã sử dụng câu trả lời @Zaz trả lời. Nó hoạt động rất tốt.

Nhưng trong khi đó nếu có sự cố với dữ liệu hạt giống của bạn (Ví dụ: bạn có tệp yaml hạt giống rất lớn), bạn muốn biết phần nào của yaml của bạn đã sai. Vào thời điểm đó bạn có thể thêm một khối sau khi tạo! để gỡ lỗi như thế này:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end 
Các vấn đề liên quan