Skip to content

clowne-rb/clowne

Folders and files

NameName
Last commit message
Last commit date

Latest commit

634cc15 ยท Mar 19, 2025
Mar 19, 2025
Aug 25, 2023
Jan 25, 2025
Mar 19, 2025
Mar 19, 2025
Mar 19, 2025
Jan 12, 2018
Jan 28, 2018
Oct 26, 2017
Aug 25, 2023
Mar 19, 2025
Mar 19, 2025
Nov 20, 2017
Aug 25, 2023
Aug 25, 2023
Mar 19, 2025

Repository files navigation

Gem Version Build Status Docs

Clowne

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.

๐Ÿ“‘ Documentation

Sponsored by Evil Martians

Installation

To install Clowne with RubyGems:

gem install clowne

Or add this line to your application's Gemfile:

gem "clowne"

Quick Start

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: '[email protected]'>

operation = UserCloner.call(user, email: "[email protected]")
# => <#Clowne::Utils::Operation...>

operation.to_record
# => <#User id: nil, login: nil, email: '[email protected]'>

operation.persist!
# => true

cloned = operation.to_record
# => <#User id: 2, login: nil, email: '[email protected]'>

cloned.login
# => nil
cloned.email
# => "[email protected]"

# associations:
cloned.posts.count == user.posts.count
# => true
cloned.profile.name
# => nil

Take a look at our documentation for more info!

Supported ORM adapters

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

Maintainers

License

The gem is available as open source under the terms of the MIT License.