Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在记录之间交换关联_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

Ruby on rails 在记录之间交换关联

Ruby on rails 在记录之间交换关联,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,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_

我们有:

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

假设我们不知何故得到了一个记录袋骰位置1和袋骰位置2。在每个记录中,已经加载了所有子关联的关联骰子。理论上,它应该在一个事务中保持两次更新。但我不知道怎么做。如何通过对数据库生成最少数量的调用来交换这些骰子的位置

好吧,如果大家都保持沉默,我将提供他自己的版本

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