[ruby-on-rails] 활성 레코드 레코드를 복제하는 가장 쉬운 방법은 무엇입니까?

프로세스에서 단일 필드를 변경하고 ( id 외에도) 활성 레코드 레코드의 사본을 만들고 싶습니다 . 이것을 달성하는 가장 간단한 방법은 무엇입니까?

새 레코드를 만든 다음 필드별로 데이터를 복사하는 각 필드를 반복 할 수 있지만 더 쉬운 방법이 있어야한다고 생각했습니다 …

같은 :

 @newrecord=Record.copy(:id)  *perhaps?*



답변

사본을 얻으려면 clone (또는 rails 3.1+의 경우 dup) 방법을 사용하십시오.

# rails < 3.1
new_record = old_record.clone

#rails >= 3.1
new_record = old_record.dup

그런 다음 원하는 필드를 변경할 수 있습니다.

ActiveRecord는 기본 제공 Object # clone재정 의하여 할당되지 않은 ID를 가진 새로운 (DB에 저장되지 않은) 레코드를 제공합니다.
연결을 복사하지 않으므로 필요한 경우 수동으로이 작업을 수행해야합니다.

Rails 3.1 복제본은 얕은 사본입니다. 대신 dup을 사용하십시오.


답변

필요와 프로그래밍 스타일에 따라 클래스의 새로운 메소드와 병합의 조합을 사용할 수도 있습니다. 더 간단한 예가 없으면 특정 날짜로 예약 된 작업이 있고 다른 날짜로 복제하려고한다고 가정하십시오. 작업의 실제 속성은 중요하지 않으므로 다음과 같이하십시오.

old_task = Task.find (task_id)
new_task = Task.new (old_task.attributes.merge ({: scheduled_on => some_new_date}))

와 새 작업이 생성됩니다 :id => nil, :scheduled_on => some_new_date원래 작업과 같은 모든 다른 속성을. Task.new를 사용하면 명시 적으로 save를 호출해야하므로 자동으로 저장하려면 Task.new를 Task.create로 변경하십시오.

평화.


답변

ActiveRecord 3.2 용 Amoeba gem 을 좋아할 수도 있습니다 .

귀하의 경우에는, 당신은 아마 사용하게 할 nullify, regex또는 prefix구성 DSL에서 사용할 수있는 옵션을.

그것은 간단하고 자동 순환 중복 지원 has_one, has_manyhas_and_belongs_to_many협회, 필드 전처리 및 모델에와 비행에 모두 적용 할 수있는 매우 유연하고 강력한 구성 DSL을.

Amoeba Documentation 을 확인해야 하지만 사용법은 매우 쉽습니다.

다만

gem install amoeba

또는 추가

gem 'amoeba'

Gemfile에

그런 다음 모델에 amoeba 블록을 추가하고 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에는 더 많은 옵션이 있으므로 설명서를 확인하십시오.

즐겨! 🙂


답변

ID를 복사하지 않으려면 ActiveRecord :: Base # dup을 사용하십시오.


답변

나는 일반적으로 속성을 복사하여 변경해야 할 사항을 변경합니다.

new_user = User.new(old_user.attributes.merge(:login => "newlogin"))


답변

연관성이있는 깊은 사본이 필요한 경우 deep_cloneable gem을 사용하는 것이 좋습니다 .


답변

Rails 5에서는 이와 같이 중복 객체 또는 레코드를 만들 수 있습니다.

new_user = old_user.dup