2010-02-26 18 views
11

Tôi đang cố gắng lưu một số dữ liệu bảng tra cứu ra tệp YAML để sau này khi tôi cần thiết lập ứng dụng của mình trên một máy khác, tôi có thể tải dữ liệu dưới dạng dữ liệu giống.Làm cách nào để tải một số mô hình ActiveRecord từ tệp YAML và lưu chúng vào DB?

Dữ liệu là nội dung như các tùy chọn được chọn và nó được đặt khá nhiều, do đó, đừng lo lắng về việc thay đổi dữ liệu trực tiếp giữa tuần tự hóa và deserializing.

Tôi có đầu ra dữ liệu như thế này ...

file = File.open("#{RAILS_ROOT}/lib/tasks/questions/questions.yml", 'w') 
questions = Question.find(:all, :order => 'order_position') 
file << YAML::dump(questions) 
file.close() 

Và tôi có thể tải các tập tin như thế này ...

questions = YAML.load_file('lib/tasks/questions/questions.yml') 

Tuy nhiên, khi tôi cố gắng tiết kiệm một câu hỏi tôi nhận được lỗi này ...

>> questions[0].save 
NoMethodError: undefined method `save' for #<YAML::Object:0x2226b84> 

Cách chính xác để làm điều này là gì?

+0

Bạn đang sử dụng phiên bản Rails nào? –

+0

Tôi đang sử dụng Rails 2.3.5 – Ethan

Trả lời

8

tôi đã cố gắng kịch bản của bạn và tôi không có bất kỳ vấn đề. Tôi đã làm những thay đổi sau đây để YAML Logic tạo tập tin của bạn:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
File.open(yml_file, 'w') do |file| 
    questions = Question.order(:order_position).to_a 
    YAML::dump(questions, file) 
end 

tôi đã có thể lấy danh sách questions như sau:

yml_file = Rails.root.join('lib', 'tasks', 'questions', 'questions.yml') 
question_attributes_list = YAML.load_file(yml_file).map(&:attributes) 
questions = Question.create(question_attributes_list) 
1

Nếu bạn đang sử dụng Rails 2.3.4 (hoặc cao hơn), chúng có tệp seeds.rb có thể được tìm thấy trong các ứng dụng của bạn db thư mục. Điều này cho phép bạn xác định kỷ lục hoạt động cơ bản tạo ra, và khi bạn đã thiết lập dự án mới của bạn, bạn chỉ có thể gọi:

rake db:seed 

Có một tuyệt vời Railscast vào nó here, và một bài đăng blog tốt về nó here. Nếu bạn không sử dụng Rails 2.3.4 (Hoặc, lý tưởng là 2.3.5), tôi khuyên bạn nên cập nhật các tính năng tuyệt vời này và thêm các sửa lỗi bảo mật/sửa lỗi.

+0

Cảm ơn, vâng đó là một tính năng tuyệt vời. Tôi muốn lưu trữ dữ liệu trong một tệp YAML và tải nó bằng cách sử dụng 'seed.rb'. Có đủ dữ liệu để mã hóa nhanh các mô hình ngay lập tức trong 'seed.rb' sẽ khó xử. – Ethan

+0

seeds.rb chỉ là một tệp ruby. Bạn có thể tải YAML bên trong seed.rb như được mô tả ở đây (http://ruby-doc.org/core/classes/YAML.html), và chỉ cần lặp qua các mảng (s) trong khi thực hiện một Model.create(). –

20

Tạo tệp seed.yml trong thư mục db. Thêm một tài liệu YAML cho mỗi mô hình bạn muốn tạo. Tài liệu này nên chứa danh sách hàm băm. Mỗi băm phải chứa các thuộc tính mô hình.

users: 
     - login: jake 
      password: jake123 
      password_confirmation: jake123 
      first_name: Jake 
      last_name: Driver 

     - login: Jane 
      password: jane123 
      password_confirmation: jane123 
      first_name: Jane 
      last_name: McCain 

    categories: 

    products: 

Trong file seed.rb bạn

seed_file = File.join(Rails.root, 'db', 'seed.yml') 
config = YAML::load_file(seed_file) 
User.create(config["users"]) 
Category.create(config["categories"]) 
Product.create(config["products"]) 

Run nhiệm vụ cào để nạp hàng

rake db:seed 
+0

Con người, điều này rất hữu ích để biết. Cảm ơn bạn. Nó vẫn có liên quan trong Rails 4? – Batman

+0

@Batman Tôi nghĩ vậy. Điều này dựa trên tiêu chuẩn YAML parser và AR array create method. –

10

Liệu câu trả lời chấp nhận thực tế trả lời câu hỏi? Có vẻ như người hỏi muốn lưu các mô hình, không chỉ lấy chúng từ một tệp YAML.

Để thực sự lưu (các) mô hình đã tải về cơ sở dữ liệu bạn cần đánh dấu ActiveRecord vào suy nghĩ mô hình cần lưu. Bạn có thể làm điều đó với mã bit khá bẩn này

questions = YAML.load_file("#{RAILS_ROOT}/lib/tasks/questions/questions.yml") 
questions.each{|q| q.instance_variable_set("@new_record", true); q.save} 

Nó hoạt động và lưu thịt xông khói của tôi một hoặc hai lần.

+0

Cảm ơn, đây là chút tôi cần để làm cho nó hoạt động. – Jurgen

+0

Đây phải là câu trả lời được chấp nhận. Cảm ơn! – cschille

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