Вам также может понравиться Amoeba gem для ActiveRecord 3.2.
В вашем случае вы, вероятно, захотите использовать nullify
, regex
или prefix
, доступные в конфигурации DSL.
Он поддерживает простое и автоматическое рекурсивное дублирование ассоциаций has_one
, has_many
и has_and_belongs_to_many
, предварительную обработку полей и гибкую и мощную конфигурацию DSL, которая может быть применена
обязательно проверьте Amoeba Documentation , но использование довольно просто ...
просто
]
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 есть еще больше возможностей, поэтому обязательно проверьте документацию.
Наслаждайтесь! :)