Links: GitHub | Travis CI | RubyGems | RDocs
Have you ever collected multiple models (either ActiveModel or ActiveRecord) in a controller method and had to orchestrate persisting them in the correct order? This library offers an elegant solution to this.
Create a new class, also called OrchestrationModel, which collects as many models as you like and orchestrates through validation and persistence operations. Use an easy to read DSL-like API to register nested models to this OrchestrationModel and their dependencies between each other. OrchestrationModels act like a container and behave just like an ActiveModel or ActiveRecord objects themselves. Therefore you can ceep controller methods simple without writing lots of code.
Installing the Ruby Gem
If you use bundler (preferred), put model_orchestration into your applications Gemfile
.
gem "model_orchestration"
Otherwise you can of course install it globally with gem install model_orchestration
.
Example
Consider you're developing a B2B SaaS application with a signup form. When a new client signs up, you will probably need to create multiple models and save them to the database, for example a user object, representing the person signing up and an organization object which attaches the user to a legal entity which represents your customer, billing data etc.
ModelOrchestration allows you to nest the user model and the organization model into an OrchestrationModel, on which all the actions necessary can be performed (validation, persistence). Let's call this OrchestrationModel simply Signup.
class User < ActiveRecord::Base
belongs_to :organization
validates :name, presence: true
validates :email, presence: true
end
class Organization < ActiveRecord::Base
has_many :users
validates :name, presence: true
end
class Signup
include ModelOrchestration::Base
include ModelOrchestration::Persistence
nested_model :organization
nested_model :user
nested_model_dependency from: :user, to: :organization
end
signup = Signup.new(user: {name: "Nils", email: "nils@example.org"}, organization: {name: "Nils' Webdesign Agency"})
signup.valid? # => true
signup.user.name # => "Nils"
signup.user # => #<User:0x007f81f498d078>
signup[:user][:email] # => "nils@example.org"
signup.save # => true
Development & Contributions
To start development on the model_orchestration itself, follow these steps.
git clone https://github.com/nsommer/model_orchestration.git
cd model_orchestration/
bundle install
You can run the tests with rake.
bundle exec rake
To build the rdoc files, run the corresponding rake task.
bundle exec rake rdoc
This generates the docs
directory and puts all the documentation into it.
Changelog
See CHANGELOG.md
.
License
Model Orchestration is released under the MIT license.