2012-06-05 50 views
1

我有一個表與五個不同的關係到其他表。在刪除記錄之前,我需要將其所有子項移至另一個記錄。要做到這一點,我僱用以下代碼:ActiveRecord將所有的孩子移動到另一個記錄

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.send(assoc.name) << *self.send(assoc. name)(注意splat操作符),但我無法弄清楚這樣做的有效語法。所以我的問題是兩個:

  1. 你如何「啪」一個任意數組輸入到「< <」?
  2. 是否需要讓孩子重新分配工作正確?

回答

1

好吧,下面是正確答案:

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

2)原始技術效率低下,生成'n'個SQL更新,每個更新一個子記錄。更有效的技術是self.send(assoc.name).update_all(parent_id: target.id)。它需要知道如何完成鏈接(在我的情況下,大多數情況下,一個外鍵字段),我想這可能會從協會中反映出來)。

相關問題