2017-07-24 108 views
0

我需要一些幫助來解決我的問題。Rails模型關聯和銷燬方法

我正在開發一個項目,在該項目中開發應用程序的管理員功能。我的問題與兩個Destroy函數有關,它們與它們自己如何相關:

簡化,我有3個模型(測試,應用程序和JoinTestJob)在代碼示例中描述。

我希望管理器只有在與任何應用程序的對象相關時才能銷燬JoinTestJob的對象。我需要應用程序對象的一致性。這就是我在JoinTestJob模型中創建before_destroy方法的原因。直到這裏工作正常。

我也希望管理器能夠銷燬一個Test的對象,並且與此相關聯的對象也應該被銷燬,正如Test模型中聲明的那樣。所以在這裏開始的問題:

當我刪除一個測試的對象,我可以看到在日誌中,所有的應用程序的對象關聯首先被刪除。之後,應該將JoinTestJob的對象刪除,但我得到了回滾。我知道回滾的原因是JoinTestJob中的before_destroy方法(我可以在日誌中看到它)。顯然,這個方法仍然可以找到應用程序的對象,即使我在日誌中看到它們被刪除。在這種情況下,看起來他們真的會在交易完成後被刪除。

那麼,我該如何完成這兩個功能的工作?

型號

class Test < ApplicationRecord 
    has_many :applications, :dependent => :destroy 
    has_many :persons, through: :applications 

    has_many :join_test_jobs, :dependent => :destroy 
    has_many :jobs, through: :join_test_jobs 

class Application < ApplicationRecord 
    belongs_to :join_test_job 
    belongs_to :person 

class JoinTestJob < ApplicationRecord 
    belongs_to :test 
    belongs_to :job 

    before_destroy :check_relation_between_application_and_join_test_job 

    def check_relation_between_application_and_join_test_job 
     if Application.find_by(join_test_job_id: "#{self.id}") 
     self.errors.add(:base, "It's not possible to delete this item, because there are some applications related with. Please, delete them first.") 
     throw(:abort) 
     end 
    end 

編輯1:

有關意見要求的日誌,它的真正基礎。我會問你們忽略圖像中的一些細節。我不得不將問題翻譯成英文,因此圖片中有一些葡萄牙文字。在日誌中觀察到的重要事項:

所有與Test相關的應用程序的對象都被首先刪除。然後,當rails開始查找JoinTestJob的對象時,您可以看到回滾。在回滾之前,由before_destroy方法觸發的應用程序發出最後一個請求,如日誌圖像中所示。在最後一個請求中調用throw(:abort)方法。

Word的翻譯:

Application/applications => Inscricao/inscricaos 

JoinTestJob/join_test_jobs => JoinConcursoCargo/join_concurso_cargos 

爲了澄清的事情,DadosPessoalCandidato和DadosPortadorDeficiencia與應用相關的模型和他們持有大約是誰申請,如地址和電話個人信息。他們可以被忽略。

Log img

編輯2:

添加什麼代表車型的更多信息,讓你們能更好地理解這個問題。

測試模型:這就像公務員考試,人們會申請找工作。誰會在考試中取得最好的成績將被選中。這個模型持有的信息:當這個考試會發生,在考試的規則有關的文件,當考試成績將被釋放等

JoinTestJob模式:它加入了一個工作和測試的概念提供這些工作。在這裏,我們可以找到的信息:作業的特殊性,如工作時段,多少元一天,工資工作等的時間

應用模式:這種模式保持與人相關的信息是誰申請提供工作的工作和測試。所以,我們可以在這裏找到這樣的信息:這個人申請什麼工作,他/她支付多少申請費用,測試(考試)的日期將會發生,個人信息如年齡,姓名,地址。一個人可以爲同一個測試申請多個工作。

我希望我可以幫助你們這些新的信息。

+0

您可以將日誌添加到您的問題嗎? – Jeremie

回答

1

我想你應該改變你的機型:

class Test < ApplicationRecord 
    has_many :applications, :dependent => :destroy 

class Application < ApplicationRecord 
    has_one :join_test_job, dependent: :destroy 

class JoinTestJob < ApplicationRecord 
    belongs_to :application 
    validates :application, presence: true 

所以,如果一個測試被破壞,那麼applications涉及與destroyed test將被銷燬,然後用JoinTestJob destroyed applications也被破壞有關。

我假設JoinTestJob模型存儲在join_test_jobs模型和有application_id

可以使場店application_idNOT NULL在數據庫級,並添加validates :application, presence: true代碼,確保一個JoinTestJob總是有一個相關應用。

+0

我編輯我的答案,這樣你可以瞭解更多一點。你的回答很好,但它不適用於我的情況。我應該在第一時間寫更多的信息。抱歉。 –