2017-07-24 110 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

我编辑我的答案,这样你可以了解更多一点。你的回答很好,但它不适用于我的情况。我应该在第一时间写更多的信息。抱歉。 –