Você também pode gostar da gema Ameba do ActiveRecord 3.2.
No seu caso, você provavelmente vai querer fazer uso dos nullify
, regex
ou prefix
opções disponíveis no DSL configuração.
Ele suporta a duplicação fácil e automático recursiva has_one
, has_many
e has_and_belongs_to_many
associações, pré-processamento de campo e um DSL configuração altamente flexível e poderosa que pode ser aplicado tanto para o modelo e em tempo real.
verifique a documentação da ameba, mas o uso é bastante fácil ...
somente
gem install amoeba
ou adicione
gem 'amoeba'
para o seu Gemfile
adicione o bloco de ameba ao seu modelo e execute o dup
método como de costume
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
enable
end
end
class Comment < ActiveRecord::Base
belongs_to :post
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts
end
class PostsController < ActionController
def some_method
my_post = Post.find(params[:id])
new_post = my_post.dup
new_post.save
end
end
Você também pode controlar quais campos são copiados de várias maneiras, mas, por exemplo, se você deseja impedir que os comentários sejam duplicados, mas deseja manter as mesmas tags, pode fazer algo assim:
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
exclude_field :comments
end
end
Você também pode pré-processar os campos para ajudar a indicar exclusividade com prefixos e sufixos, além de expressões regulares. Além disso, também existem inúmeras opções para que você possa escrever no estilo mais legível para o seu propósito:
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
include_field :tags
prepend :title => "Copy of "
append :contents => " (copied version)"
regex :contents => {:replace => /dog/, :with => "cat"}
end
end
A cópia recursiva de associações é fácil, basta ativar a ameba em modelos infantis também
class Post < ActiveRecord::Base
has_many :comments
amoeba do
enable
end
end
class Comment < ActiveRecord::Base
belongs_to :post
has_many :ratings
amoeba do
enable
end
end
class Rating < ActiveRecord::Base
belongs_to :comment
end
A configuração DSL tem ainda mais opções, portanto, verifique a documentação.
Aproveitar! :)
q = p.clone
, e depoisp == q
, eu recebotrue
de volta. Por outro lado, se eu usarq = p.dup
,false
volto ao compará-las.