Також вам може сподобатися дорогоцінний камінь Amoeba для ActiveRecord 3.2.
У вашому випадку, ви , ймовірно , хочете, щоб використовувати nullify
, regex
або prefix
опцій , доступних в DSL конфігурації.
Він підтримує просте і автоматичне рекурсивне дублювання has_one
, has_many
і has_and_belongs_to_many
асоціацію, поле попередньої обробку і дуже гнучку і потужну конфігурацію DSL , які можуть бути застосовані як до моделі і на літа.
не забудьте перевірити документацію на Амебу, але використання досить просто ...
просто
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
повертаюся, коли порівнюю їх.