activerecord-import
1. Gem activerecord-import activerecord-import là 1 thư viện hỗ trợ việc thêm số lượng lớn dữ liệu vào database sử dụng ActiveRecord. Tương thích với các bản rails 3.x trở lên. Tại sao lại sử dụng activerecord-import? Bởi vì rails ActiveRecord không hỗ trợ việc thêm đồng thời nhiều bản ghi ...
1. Gem activerecord-import
activerecord-import là 1 thư viện hỗ trợ việc thêm số lượng lớn dữ liệu vào database sử dụng ActiveRecord. Tương thích với các bản rails 3.x trở lên.
Tại sao lại sử dụng activerecord-import?
Bởi vì rails ActiveRecord không hỗ trợ việc thêm đồng thời nhiều bản ghi một lúc mà chính ta phải thêm một các tuần tự từng bản ghi, vì vậy chúng ta sẽ bị lãng phí thời gian cho việc tạo kết nối. Điều này giống như việc vận chuyển 10 gói hàng bằng 10 chiếc xe tải tuần tự vậy.
10.times do |i| Book.create! name: "book #{i}" end
Nếu chỉ là 10 bản ghi thì vấn đề cũng không có gì là nghiêm trọng nhưng nếu là 100, 1000... bản ghi thì thời gian để import được số bản ghi này là khá lớn. Chưa kể nếu sử dụng transaction thì đồng nghĩa với việc table này sẽ bị lock trong khoảng thời gian chờ các bản ghi này được import hết.
2. Giải pháp
Sử dụng 1 chiếc xe tải cỡ lớn, vận chuyển một lúc 100, 1000 gói hàng.
Sử dụng thư viện active-import để import nhiều bản ghi cùng 1 lúc (sử dụng 1 câu lệnh SQL để import vào database).
1. using Gem, bundle
gem "activerecord-import"
2. implement
books = [] 10.times do |i| books << Book.new(:name => "book #{i}") end Book.import books
Ở đoạn code trên, ta khởi tạo 1 mảng book, sau đó thêm các bản ghi vào mảng books. Sau đó dùng lệnh Book.import books để import các bản ghi này vào database.
3. import record with has_many associations
Giả sử có quan hệ Books has_many Reviews
books = [] 10.times do |i| book = Book.new :name: "book #{i}" book.reviews.build title: "Excellent" books << book end Book.import books, recursive: true
Như vậy cả books, cả các bản ghi reviews liên quan tới nó cũng được import vào database.
4. more
Sử dụng 2 câu SQL để import 10 bản ghi. Tránh trường hợp quá tải khi import lượng rất lớn bản ghi.
Book.import books, batch_size: 5
Hi vọng bài viết này đơn giản, dễ hiểu và hữu ích. Tham khảo: https://github.com/zdennis/activerecord-import/wiki/Examples thanks.