记录之间的交换关联

时间:2014-05-27 23:14:37

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我们有:

class Dice < ActiveRecord::Base
  belongs_to :sign_a, class_name: 'Sign'
  belongs_to :sign_b, class_name: 'Sign'
  belongs_to :sign_c, class_name: 'Sign'
  ...
  belongs_to :dice_place, polymorphic: true

  validates :sign_a, :sign_b, :sign_c, ..., :dice_place, presence: true
end

class BagDicePlace < ActiveRecord::Base
  has_one :dice, as: :dice_place, dependent: :destroy
end

假设我们以某种方式获得了记录bag_dice_place_1bag_dice_place_2。在每个记录中,已加载与所有子关联的关联dice。从理论上讲,它应该在一个事务中保持两个更新。但我不知道该怎么做。如何通过生成对数据库的最小调用次数来交换这些dice - s的位置?

1 个答案:

答案 0 :(得分:0)

好吧,如果一切都是沉默的话,我会提供自己的版本。

d1 = bag_dice_place_1.dice
d2 = bag_dice_place_2.dice

Dice.transaction do
  if d1
    d1.update(dice_place: bag_dice_place_2)
  end

  if d2
    d2.update(dice_place: bag_dice_place_1)
  end
end

bag_dice_place_1.association(:dice).target = d2
bag_dice_place_2.association(:dice).target = d1