1
class Game
  has_many :players, dependent: :destroy
end

class Player
  belongs_to :game
end

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

我们如何在不使用任何 gem 的情况下,以最简洁的方式复制这四个记录?

这是 围绕同一主题的两个关于 SO 的问题,但要么使用宝石,要么看起来过于复杂。

4

1 回答 1

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]

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

于 2013-09-19T19:46:22.277 回答