También le puede interesar el Amoeba gem para ActiveRecord 3.2.
En su caso, es probable que desee utilizar las opciones nullify
, regex
o prefix
disponibles en la configuración DSL.
Soporta fácil y automática la duplicación recursiva de has_one
, has_many
y has_and_belongs_to_many
asociaciones, preprocesamiento de campo y una DSL configuración altamente flexible y potente que se puede aplicar tanto al modelo y sobre la marcha.
asegúrate de revisar el Amoeba Documentation pero el uso es bastante fácil ...
simplemente
gem install amoeba
o añadir
gem 'amoeba'
a su Gemfile
continuación, agregue el bloque de ameba a su modelo y ejecute el método dup
como de costumbre
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
También puede controlar qué campos se copian de muchas maneras, pero por ejemplo, si se quería evitar que los comentarios puedan ser duplicados, sino que quería mantener las mismas etiquetas, se podría hacer algo como esto:
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
exclude_field :comments
end
end
Usted también puede preprocesar campos para ayudar a indicar la singularidad con prefijos y sufijos, así como con expresiones regulares. Además, también hay numerosas opciones para que pueda escribir en el estilo más legible para su 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
copia recursiva de las asociaciones es fácil, basta con activar la ameba en niños modelos, así
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
La configuración DSL tiene aún más opciones, así que asegúrese de revisar la documentación.
¡Disfrútalo! :)
¿Este siguen trabajando en Rails 3.1.0.beta? Cuando hago 'q = p.clone', y luego' p == q', recupero 'true'. Por otro lado, si uso 'q = p.dup', obtengo' false' de vuelta cuando los comparo. –
Los [documentos de Rails 3.1 en el clon] (http://edgeapi.rubyonrails.org/classes/ActiveResource/Base.html#method-clone) dicen que todavía funciona, pero estoy usando Rails 3.1.0.rc4 e incluso el método 'nuevo?' no está funcionando. – Turadg
Cuando intento clonar y luego guardar en Rails 3.1 RC4, aparece el error 'Mysql2 :: Error: Duplicate entry' en la clave principal. – skattyadz