Może ci się spodobać klejnot Amoeba dla ActiveRecord 3.2.
W twoim przypadku, prawdopodobnie chcesz skorzystać z nullify
, regex
lub prefix
opcji dostępnych w konfiguracji DSL.
To pozwala na łatwe i automatyczne rekurencyjną powielania has_one
, has_many
oraz has_and_belongs_to_many
stowarzyszenia, wstępne przetwarzanie pole i wysoce elastyczny i potężny DSL konfiguracji, które mogą być stosowane zarówno do modelu i na bieżąco.
koniecznie sprawdź dokumentację Amoeba, ale korzystanie z niej jest dość łatwe ...
właśnie
gem install amoeba
lub dodaj
gem 'amoeba'
do twojego Gemfile
następnie dodaj blok ameby do swojego modelu i uruchom dup
metodę jak zwykle
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
Możesz także kontrolować, które pola są kopiowane na wiele sposobów, ale na przykład, jeśli chcesz zapobiec duplikowaniu komentarzy, ale chcesz zachować te same tagi, możesz zrobić coś takiego:
class Post < ActiveRecord::Base
has_many :comments
has_and_belongs_to_many :tags
amoeba do
exclude_field :comments
end
end
Możesz również wstępnie przetwarzać pola, aby pomóc wskazać unikalność zarówno przedrostków, jak i przyrostków, a także wyrażeń regularnych. Ponadto istnieje wiele opcji, dzięki którym możesz pisać w najbardziej czytelnym stylu:
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
Rekurencyjne kopiowanie skojarzeń jest łatwe, po prostu włącz amebę także w modelach potomnych
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
Konfiguracja DSL ma jeszcze więcej opcji, więc sprawdź dokumentację.
Cieszyć się! :)
q = p.clone
, a potemp == q
, mamtrue
powrotem. Z drugiej strony, jeśli użyjęq = p.dup
,false
wrócę podczas ich porównywania.