Вам также может понравиться драгоценный камень Amoeba для ActiveRecord 3.2.
В вашем случае, вы , вероятно , хотите, чтобы использовать nullify
, regex
или prefix
опций , доступных в DSL конфигурации.
Он поддерживает простое и автоматическое рекурсивное дублирование has_one
, has_many
и has_and_belongs_to_many
ассоциацию, поле предварительной обработку и очень гибкую и мощную конфигурацию DSL , которые могут быть применены как к модели и на лета.
Обязательно ознакомьтесь с документацией Amoeba, но ее использование довольно просто ...
просто
gem install amoeba
или добавить
gem 'amoeba'
в ваш Gemfile
затем добавьте блок амебы в вашу модель и запустите dup
метод как обычно
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
Вы также можете контролировать, какие поля копируются различными способами, но, например, если вы хотите предотвратить дублирование комментариев, но хотите сохранить те же теги, вы можете сделать что-то вроде этого:
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
exclude_field :comments
end
end
Вы также можете предварительно обработать поля, чтобы помочь указать уникальность как с префиксами и суффиксами, так и с регулярными выражениями. Кроме того, есть также множество опций, поэтому вы можете писать в наиболее удобном для вас стиле:
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
Рекурсивное копирование ассоциаций легко, просто включите амебу на дочерних моделях.
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
Конфигурационный DSL имеет еще больше опций, поэтому обязательно ознакомьтесь с документацией.
Наслаждайтесь! :)
q = p.clone
, и тогдаp == q
яtrue
вернусь. С другой стороны, если я используюq = p.dup
, яfalse
возвращаюсь при сравнении их.