A flexible gem for cloning your models. Clowne focuses on ease of use and provides the ability to connect various ORM adapters.
📖 Read Evil Martians Chronicles to learn about possible use cases.
Clowne is built by Evil Martians, an American design and engineering consultancy for developer tools, AI, and cybersecurity startups.
To install Clowne with RubyGems:
gem install clowneOr add this line to your application's Gemfile:
gem "clowne"Assume that you have the following model:
class User < ActiveRecord::Base
# create_table :users do |t|
# t.string :login
# t.string :email
# t.timestamps null: false
# end
has_one :profile
has_many :posts
end
class Profile < ActiveRecord::Base
# create_table :profiles do |t|
# t.string :name
# end
end
class Post < ActiveRecord::Base
# create_table :posts
endLet's declare our cloners first:
class UserCloner < Clowne::Cloner
adapter :active_record
include_association :profile, clone_with: SpecialProfileCloner
include_association :posts
nullify :login
# params here is an arbitrary Hash passed into cloner
finalize do |_source, record, **params|
record.email = params[:email]
end
end
class SpecialProfileCloner < Clowne::Cloner
adapter :active_record
nullify :name
endNow you can use UserCloner to clone existing records:
user = User.last
# => <#User id: 1, login: 'clown', email: 'clown@circus.example.com'>
operation = UserCloner.call(user, email: "fake@example.com")
# => <#Clowne::Utils::Operation...>
operation.to_record
# => <#User id: nil, login: nil, email: 'fake@example.com'>
operation.persist!
# => true
cloned = operation.to_record
# => <#User id: 2, login: nil, email: 'fake@example.com'>
cloned.login
# => nil
cloned.email
# => "fake@example.com"
# associations:
cloned.posts.count == user.posts.count
# => true
cloned.profile.name
# => nilTake a look at our documentation for more info!
| Adapter | 1:1 | *:1 | 1:M | M:M |
|---|---|---|---|---|
| Active Record | has_one | belongs_to | has_many | has_and_belongs_to |
| Sequel | one_to_one | - | one_to_many | many_to_many |
The gem is available as open source under the terms of the MIT License.