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.
To install Clowne with RubyGems:
gem install clowne
Or 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
end
Let'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
end
Now 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
# => nil
Take 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.