我需要一些帮助来解决我的问题。
我正在开发一个项目,在那里我开发了应用程序的管理器功能。我的问题与两个Destroy函数以及它们与自己的关系有关:
简化,我在代码示例中有3个模型(Test,Application和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方法触发Application的最后一个请求,正如您在Log的图像中看到的那样。在最后一个请求中调用了throw(:abort)方法。
Word的翻译:
Application/applications => Inscricao/inscricaos
JoinTestJob/join_test_jobs => JoinConcursoCargo/join_concurso_cargos
为了澄清事情,DadosPessoalCandidato和DadosPortadorDeficiencia是与应用程序相关的模型,他们持有关于谁申请的个人信息,如地址和电话。它们可以被忽略。
编辑2:
添加有关代表模型的更多信息,以便您可以更好地理解问题。
测试模式:这就像公务员考试一样,人们会申请找工作。在考试中获得最高分的人将被选中参加这项工作。该模型包含以下信息:当考试发生时,与考试规则相关的文件,考试结果何时发布等等。
JoinTestJob模型:它加入了提供这些工作的Job和Test的概念。在这里,我们可以找到以下信息:工作的特殊性,如工作时间,每天工作时数,工资等。
应用程序模型:此模型包含与申请作业的人员和提供作业的测试相关的信息。因此,我们可以在这里找到以下信息:该人申请的工作,申请支付的金额,考试(考试)的日期,个人信息,年龄,姓名,地址等。一个人可以为同一个测试申请多个工作。
我希望我能用这些新信息帮助你们。
答案 0 :(得分: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
的关联将被销毁,然后与destroyed applications
关联的JoinTestJob也将被销毁。
我认为JoinTestJob
模型存储在join_test_jobs
模型中并且application_id
。
您可以在数据库级别将字段存储application_id
设为NOT NULL
,并添加validates :application, presence: true
代码,确保JoinTestJob
始终有一个相关的应用程序。