2011-09-01 82 views
0

所以我有一個Task模型,一個票據模型和一個Category模型。從一個模型到另一個模型關聯的重複主動記錄

類別的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 

構建創建關聯的新對象,分配給你的外鍵。然後你只需調用保存在父模型上,它將執行所有正確的插入語句。

+0

工作得很好,看起來更清潔。我需要被複制,而不是綁定到類別和票據上,因爲每次使用與另一張票據相同的類別創建票證時,我不能讓某人需要將其檢查爲完成,這是任務的屬性。否則,有人會檢查任務是否完成,並且任務也可以爲所分配的所有票證完成。感謝讓它看起來更好。 – Marc

+0

好的,因爲我不知道細節,這對您的特定用例可能更有意義。有一件事,如果你想確保你正確地處理第二個對象的保存,可能會包裝一個if語句並在保存失敗時執行某種記錄或通知。另一種選擇是使用保存!相反,如果模型存在驗證問題,則會引發異常。而且你非常歡迎:)。 – agmcleod

0

其實dexter我把它評論出來,當我嘗試它,它現在工作。所以我想我的作品很好。除非有人知道我可以如何改進它並使之更加清潔。現在正在工作。

相關問題