Rails模型关联和销毁方法

时间:2017-07-24 21:46:25

标签: ruby-on-rails oop associations has-many-through

我需要一些帮助来解决我的问题。

我正在开发一个项目,在那里我开发了应用程序的管理器功能。我的问题与两个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是与应用程序相关的模型,他们持有关于谁申请的个人信息,如地址和电话。它们可以被忽略。

Log img

编辑2:

添加有关代表模型的更多信息,以便您可以更好地理解问题。

测试模式:这就像公务员考试一样,人们会申请找工作。在考试中获得最高分的人将被选中参加这项工作。该模型包含以下信息:当考试发生时,与考试规则相关的文件,考试结果何时发布等等。

JoinTestJob模型:它加入了提供这些工作的Job和Test的概念。在这里,我们可以找到以下信息:工作的特殊性,如工作时间,每天工作时数,工资等。

应用程序模型:此模型包含与申请作业的人员和提供作业的测试相关的信息。因此,我们可以在这里找到以下信息:该人申请的工作,申请支付的金额,考试(考试)的日期,个人信息,年龄,姓名,地址等。一个人可以为同一个测试申请多个工作。

我希望我能用这些新信息帮助你们。

1 个答案:

答案 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

因此,如果测试被销毁,那么applicationsdestroyed test的关联将被销毁,然后与destroyed applications关联的JoinTestJob也将被销毁。

我认为JoinTestJob模型存储在join_test_jobs模型中并且application_id

您可以在数据库级别将字段存储application_id设为NOT NULL,并添加validates :application, presence: true代码,确保JoinTestJob始终有一个相关的应用程序。