docs/after_persist.md
# After Persist
*Notice: `after_persist` supported only with [`active_record`](active_record.md) adapter.*
The special mechanism for transformation of cloned record. In contradistinction to [`finalize`](finalize) executes with a saved record. This type of callbacks provides a default `mapper:` parameter which contains a relation between origin and cloned objects.
`after_persist` helps to restore broken _relationships_ while cloning associations and implement some logic with already persisted clone record. (_Inspired by [issues#19](https://github.com/palkan/clowne/issues/19)_)
Examples:
```ruby
class User < ActiveRecord::Base
# create_table :users do |t|
# t.string :login
# t.integer :bio_id
# end
has_many :posts # all user's posts including BIO
belongs_to :bio, class_name: "Post"
end
class Post < ActiveRecord::Base
# create_table :posts do |t|
# t.integer :user_id
# end
end
class UserCloner < Clowne::Cloner
include_association :posts, params: true
after_persist do |origin, clone, mapper:, **|
cloned_bio = mapper.clone_of(origin.bio)
clone.update(bio_id: cloned_bio.id)
end
end
class PostCloner < Clowne::Cloner
after_persist do |_, clone, run_job:, **|
PostBackgroundJob.perform_async(clone.id) if run_job
end
end
```
*Notice: See more about `mapper:` [`here`](clone_mapper.md).*
`after_persist` runs when you call [`Operation#persist`](operation) (or `Operation#persist!`)
```ruby
# prepare data
user = User.create
posts = Array.new(3) { Post.create(user: user) }
bio = posts.sample
user.update(bio_id: bio.id)
operation = UserCloner.call(user, run_job: true)
# => <#Clowne::Utils::Operation ...>
clone = operation.to_record
# => <#User id: nil, ...>
# we copy all user attributes including bio_id
# but this is wrong because bio refers to the source user's bio
# and we can fix it using after_persist when posts already saved
clone.bio_id == bio.id
# => true
# save clone and run after_persist callbacks
operation.persit
clone.bio_id == bio.id
# => false
clone.posts.pluck(:id).include?(clone.bio_id)
# => true
```
*Notice: be careful while using after_persist feature! If you clone a fat record (with a lot of associations) and will implement complex logic inside `after_persist` callback, it may affect your system.*