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