col_active_importer_starter
col_active_importer_starter is a starter(or wrapper) to active_importer - https://github.com/continuum/active_importer gem.
Features
col_active_importer_starter
makes full use of active_importer
gem to import tabular data from spreadsheets or similar sources into Active Record models.
- The best practices of
active_importer
, such as: - Introduce a optional cache to retain data in the memory
- Use rubyXL to write out a file with the original data and more information for result
Installation
Add this line to your application's Gemfile:
gem 'col_active_importer_starter'
And then execute:
bundle
Or install it yourself as:
gem install col_active_importer_starter
Usages
Suppose there is a ActiveRecord model Article
:
class Article < ApplicationRecord
end
and tabular data file data/Articles.xlsx
Title | Body |
---|---|
Article.1.title | Article.1.body |
Article.2.title | Article.2.body |
- Create a
ArticleImporter
extendColActiveImporterStarter::BaseImporter
# app/importers/article_import.rb
class ArticleImporter < ColActiveImporterStarter::BaseImporter
imports Article
transactional
module ColumnName
Title = "Title"
Body = "Body"
end
column ColumnName::Title, :title
column ColumnName::Body, :body
def handle_fetch_model
params = {
title: row[ColumnName::Title],
}
model = Article.find_or_initialize_by(params)
model
end
fetch_model do
handle_fetch_model
end
def handle_skip_rows_if?
row[ColumnName::Title].blank?
end
skip_rows_if do
handle_skip_rows_if?
end
# ArticleImporter.execute
def self.execute(file = "#{Rails.root}/data/Articles.1.xlsx")
params = {
cache: {},
file: file,
result_index: 10,
}
import(file, params: params)
end
private
end
- Import data from a file.
ArticleImporter.import("#{Rails.root}/data/Articles.1.xlsx")
# Or use ArticleImporter instance.
# importer = ArticleImporter.new(file, {params: params(file)})
# importer.import
# puts importer.row_count
Or specify more arguments.
params = {
cache: {},
file: "#{Rails.root}/data/Articles.1.xlsx",
result_index: 3,
}
ArticleImporter.import(file, {params: params})
# Or use ArticleImporter instance.
# importer = ArticleImporter.new(file, {params: params(file)})
# importer.import
# puts importer.row_count
For more examples to see ./test/dummy/test/importers/article_importer_test.rb.
- Then, check
tmp/importers
directory to find the result file.
Title | Body | Result ID | Result Message | |
---|---|---|---|---|
Article.1.title | Article.1.body | 1 | success | |
Article.2.title | Article.2.body | 2 | success |
Testing
Run rails test
to execute all test cases in test/dummy/test
directory.
rails test test/dummy/test
Inspire
Inspire by active_importer - https://github.com/continuum/active_importer.
Contributing
Contributions are welcome! Take a look at our contributions guide for details. The basic workflow for contributing is the following:
- Fork it - https://github.com/CloudoLife/col_active_importer_starter/fork
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create new Pull Request
License
The gem is available as open source under the terms of the MIT License - https://opensource.org/licenses/MIT.
References
[1] [CloudoLife-Rails/col_active_importer_starter: col_active_importer_starter is a starter(or wrapper) to active_importer. - https://github.com/CloudoLife-Rails/col_active_importer_starter
[5] rubyXL | RubyGems.org | your community gem host - https://rubygems.org/gems/rubyXL/
[6] RubyGems.org | your community gem host - https://rubygems.org/