12/08/2018, 13:41

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.

0