12/08/2018, 14:42

Xử lý create dữ liệu khổng lồ với import trong rails

Bắt Đầu Hi.. Như trên tiêu đề đã nói. Trong nhiều dự án đôi lúc sẽ xảy ra việc bạn phải create 1 lượng lớn dữ liệu mà hiệu suất để create 1 lượng lớn dữ liệu như vậy lại rất kém để khắc phục vấn đề này Rails đã phát triển 1 số hàm giúp cho bạn có thể bỏ qua validate và callback để create với tốc ...

Bắt Đầu

Hi.. Như trên tiêu đề đã nói. Trong nhiều dự án đôi lúc sẽ xảy ra việc bạn phải create 1 lượng lớn dữ liệu mà hiệu suất để create 1 lượng lớn dữ liệu như vậy lại rất kém để khắc phục vấn đề này Rails đã phát triển 1 số hàm giúp cho bạn có thể bỏ qua validate và callback để create với tốc độ nhanh chóng mặt. Trong đó có import mình sẽ lấy ví dụ để các bạn dễ hình dung. Hiện tại mình đang create 1000 user. và đây là kết quả Nhưng với import. Với import nó sẽ bỏ qua validate và callback để insert_into. đẩy hết toàn bộ dữ liệu vào và create 1 lần Như vậy thì vấn đề create khối lượng lớn dữ liệu đã được xử lý

Class Method Summary

Ví dụ như:

.establish_connection_with_activerecord_import(*args) ⇒ Object
.import(*args) ⇒ Object
Imports a collection of values to the database.
.import_from_table(options) ⇒ Object
TODO import_from_table needs to be implemented.
.import_helper(*args) ⇒ Object
.import_with_validations(column_names, array_of_attributes, options = {}) ⇒ Object
Imports the passed in column_names and array_of_attributes given the passed in options Hash with validations.
.import_without_validations_or_callbacks(column_names, array_of_attributes, options = {}) ⇒ Object
Imports the passed in column_names and array_of_attributes given the passed in options Hash.
.support_setting_primary_key_of_imported_objects? ⇒ Boolean
returns true if the current database connection adapter supports setting the primary key of bulk imported models, otherwise returns false.
.supports_import?(*args) ⇒ Boolean
Returns true if the current database connection adapter supports import functionality, otherwise returns false.
.supports_on_duplicate_key_update? ⇒ Boolean
Returns true if the current database connection adapter supports on duplicate key update functionality, otherwise returns false.
.synchronize(instances, keys = [self.primary_key]) ⇒ Object
Synchronizes the passed in ActiveRecord instances with data from the database.

Thực Hành

Việc đầu tiên các bạn sẽ install gem "activerecord-import", "~> 0.15.0"

gem "activerecord-import", "~> 0.15.0"
bundle

Mình sẽ viết code import trên 2 bảng database là Book has_many Reviews Việc đầu tiên là bạn tạo 1 Array để đẩy dữ liệu cần create vào

books = []

Sau đó mình sẽ thực hiện đẩy dữ liệu vào Array đó

10.times do |i| 
  book = Book.new(:name => "book #{i}")
  book.reviews.build(:title => "Excellent")
  books << book
end

Tiếp theo các bạn tiến hành import dữ liệu vào model Book

Book.import books

rất đơn giản chỉ cần 3 bước như vậy bạn đã có thể create khối lượng lớn dữ liệu mà công việc vẫn rất trơn tru

Chú Ý

Vì import sẽ bỏ qua validates và callback nên khi sử dụng bạn cần phải đọc kỹ và hiểu rõ mình cần làm gì có ảnh hưởng tới các validates callback khác không nhé GoodLucky

Tham khảo

http://www.rubydoc.info/github/zdennis/activerecord-import/ActiveRecord/Base

0