2011-09-01 3 views
0

그래서 작업 모델, 티켓 모델 및 범주 모델이 있습니다.한 모델에서 다른 모델로 연결된 중복 된 활성 레코드

분류 has_many 작업 티켓 has_many 작업 분류 has_many 티켓 카테고리 belongs_to 카테고리 작업 belongs_to 티켓 작업 belongs_to 티켓

카테고리 인 경우 카테고리로 티켓에 대한 기본 작업입니다 관련되는 작업 티켓에 링크되어 있습니다. 따라서 카테고리가 티켓에 대해 선택 될 때 티켓에 복제되고 연결될 카테고리와 연관된 태스크가 필요합니다.

내 티켓 모델에서 이런 일을 할 수 있을지 궁금하네요 :

after_create :duplicate_tasks_to_ticket 
    after_update :duplicate_tasks_to_ticket 

    def duplicate_tasks_to_ticket 
    if self.tasks.blank? 
     for task in self.category.tasks.all 
     new_task = Task.new 
     new_task.name = task.name 
     new_task.ticket_id = self.id 
     new_task.save 
     end 
    end 
    end 

는 지금이 오류가 발생하지 않습니다하지만 아무것도하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!

+0

'new_task.save'가 주석 처리 된 이유는 무엇입니까? – dexter

+0

이미 카테고리에 연결하는 경우 티켓과도 연결해야하는 이유는 무엇입니까? 작업에 묶여 있어야하는 세부 사항이 필요한 경우 해당 연관을 사용하여 범주 아래 모든 티켓을 가져옵니다. 둘 다 묶어서 사이트를 복잡하게 만듭니다. – agmcleod

+0

티켓이 생성 될 때마다 카테고리에서 작업을 복제하여 티켓에 연결해야하기 때문에. 기본적으로 카테고리에는 티켓에 대한 기본 작업이 있습니다. 작업 레코드는 티켓이나 범주 중 하나에 만 연관되어 있지만 둘 다에는 연결되어 있지 않습니다. – Marc

답변

0

이미 카테고리에 연결 한 경우 티켓과도 연결해야하는 이유는 무엇입니까? 티켓에 묶여있는 세분성이 필요한 경우 해당 연관성을 사용하여 범주 아래 모든 작업을 가져옵니다. 둘 다 묶어서 사이트를 복잡하게 만듭니다. 자, 절대적으로 양쪽 모두에 묶어야한다면 category_id, task_id를 저장하는 할당 표를 만들어야합니다. ticket_id, task_id에 대한 또 다른 할당 표. 그런 다음 데이터를 복사 할 때와 같이 작업을 하나의 레코드로 유지하십시오.

코드가 대부분 괜찮아 보입니다. 나는 .all이 결국 필요하다고 생각하지 않는다. 연결은 해당 모델에서 참조하는 모든 항목을 자동으로로드합니다.

비록 대신 협회 빌드 방법을 사용해보십시오 :

def duplicate_tasks_to_ticket 
    if self.tasks.blank? 
    for task in self.category.tasks.all 
     self.tasks.build(:name => task.name) 
    end 
    self.save 
    end 
end 

빌드 당신을위한 외래 키를 할당, 그 관계의 새로운 객체를 생성합니다. 그런 다음 부모 모델에서 save를 호출하면 모든 적절한 insert 문이 수행됩니다.

+0

잘 작동하고 훨씬 깨끗해 보입니다. 티켓이 다른 티켓과 동일한 카테고리로 생성 될 때마다 누군가가 태스크의 속성 인 완료로 확인할 필요가 없기 때문에 카테고리와 티켓에 모두 묶이지 않고 복제해야합니다. . 그렇지 않으면 누군가가 작업을 완료로 확인하고 할당 된 모든 티켓에 대해 작업을 완료 할 수 있습니다. 그 모양을 훨씬 좋게 만들어 주셔서 감사합니다. – Marc

+0

아, 세부 사항을 알지 못해서 특정 사용 사례에 더 적합한 것 같습니다.한 가지, 두 번째 객체의 저장을 올바르게 처리하려면 if 문을 래핑하고 저장에 실패하면 일종의 로깅 또는 알림을 실행하십시오. 또 다른 옵션은 save를 사용하는 것입니다! 대신 모델에 유효성 검사 문제가있는 경우 예외를 throw합니다. 그리고 당신은 가장 환영합니다 :). – agmcleod

0

실제로 덱스터 나는 그것을 시도했을 때 주석을 달았습니다. 그래서 내가 생각한 것은 잘 작동합니다. 누군가 내가 어떻게 정제하고 깨끗하게 할 수 있는지 안다면. 이제 작동 중입니다.

관련 문제