1

我有一张表,它与其他表有五种不同的多对多关系。在删除一条记录之前,我需要将其所有子项移动到另一条记录。为此,我使用以下代码:

self.class.reflect_on_all_associations.select {|assoc| assoc.macro == :has_many }.each do |assoc|
  target.send(assoc.name) << self.send(assoc.name)
end

基本上,这归结为target.child-association << self.child-association. 但这不能正常工作,从“self”中删除所有子项,并将一个子项添加到“target”,除关联字段 null 之外的所有字段。我认为这是因为“<<”需要一条记录,而我正在传递一组记录。我看到“<<”也接受参数列表,所以我认为我需要类似target.send(assoc.name) << *self.send(assoc. name)的东西(注意 splat 运算符),但我无法找出有效的语法来执行此操作。所以我的问题有两个:

  1. 你如何“splat”一个任意数组以输入“<<”?
  2. 这是使儿童重新分配正常工作所需要的吗?
4

1 回答 1

2

好的,以下是答案:

1) target.send(assoc.name).send(:<<, *(self.send(assoc.name)))

2) 原始技术效率低下,生成“n”条 SQL 更新,每条更新一条子记录。更有效的技术是self.send(assoc.name).update_all(parent_id: target.id)。它需要对链接是如何完成的(在我的情况下和大多数情况下,一个单一的外键字段)有内疚的知识,我认为这可以从关联中反映出来)。

于 2012-06-05T23:32:38.823 回答