复制/克隆记录及其相关记录

时间:2013-09-19 19:32:09

标签: ruby-on-rails ruby ruby-on-rails-3

class Game
  has_many :players, dependent: :destroy
end

class Player
  belongs_to :game
end

假设我们有一个游戏和三个玩家相关联。

我们如何在不使用宝石的情况下以最简洁的方式复制这四条记录?

Here are two questions关于同一主题的SO,但要么使用宝石,要么看起来过于复杂。

1 个答案:

答案 0 :(得分:2)

这段代码可以是一个开始:

class Game
  has_many :players

  def clone
    attributes = self.attributes
    ['id', 'created_at', 'updated_at'].each do |ignored_attribute|
      attributes.delete(ignored_attribute)
    end
    clone = Game.create(attributes)
    self.players.each do |player|
      player.clone.update_attributes(game_id: clone.id)
    end

    clone
  end
end

class Player
  belongs_to :game

  def clone
    attributes = self.attributes
    ['id', 'created_at', 'updated_at'].each do |ignored_attribute|
      attributes.delete(ignored_attribute)
    end
    clone = Player.create(attributes)

    clone
  end
end

有了这个,您可以创建一个模块acts_as_clonable,并将其包含在您的模型中,并提供一些选项:

class Game
  has_many :players

  acts_as_clonable relations: [:players], destroy_original: false, ignored_attributes: [:this_particular_attribute]

如果你有野心,你可以用这个制作宝石......; - )