2012-06-05 2 views
1

다른 테이블과 5 가지 다 관계가있는 테이블이 있습니다. 레코드를 삭제하기 전에 모든 자식을 다른 레코드로 이동해야합니다.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"에서 삭제하고 하나의 자식을 관련 필드 null을 제외한 모든 필드와 함께 "target"에 추가합니다. 나는 이것이 "< <"이 레코드를 기대하고 레코드 배열을 전달하기 때문이라고 생각합니다. 나는 "< <"도 인수 목록을 받아들이므로 target.send(assoc.name) << *self.send(assoc. name) (splat 연산자에 유의하십시오)과 같은 것이 필요하다고 생각합니다. 그러나이 작업을위한 올바른 구문을 이해할 수 없습니다. 그래서 제 질문은 두 가지가 있습니다 :

  1. 어떻게 당신 "플랫" "< <"에 입력에 대한 임의의 배열?
  2. 자식 재 할당을 올바르게 수행하는 데 필요한 것은 무엇입니까?

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

답변

1

좋아, 여기 해답이다 2) 원래 기술은 'n'개의 SQL 업데이트를 생성하는 데 비효율적이며, 각각 하나의 하위 레코드를 업데이트합니다. 보다 효율적인 기술은 self.send(assoc.name).update_all(parent_id: target.id)입니다. 연결이 어떻게 이루어 졌는지에 대한 유죄의 지식이 필요합니다 (내 경우에는 대부분의 경우 단일 외래 키 필드). 협회에서 반영 될 수 있습니다.

관련 문제