【问题标题】:ActiveRecord Move All Children to Another RecordActiveRecord 将所有子项移动到另一条记录
【发布时间】:2012-06-09 18:39:03
【问题描述】:

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

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 &lt;&lt; self.child-association。但这不能正常工作,从“self”中删除所有子项,并将一个子项添加到“target”,除关联字段 null 之外的所有字段。我认为这是因为“target.send(assoc.name) << *self.send(assoc. name) 这样的东西(注意 splat 运算符),但我不知道这样做的有效语法。所以我的问题有两个:

  1. 如何将任意数组“分解”为“
  2. 这是使儿童重新分配正常工作所需要的吗?

【问题讨论】:

    标签: ruby-on-rails activerecord associations splat


    【解决方案1】:

    好的,答案如下:

    1) target.send(assoc.name).send(:

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

    【讨论】:

    • 要完成@jack-r-g对问题2的回答(6年后...),可以通过从反射中检索外键来避免有罪的知识:self.send(assoc.name).update_all(assoc.foreign_key =&gt; target.id)
    • 好点,@MichaelBaudino。它仍然假设链接是通过 PK 进行的,但这比外键名称的假设要少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多