2017-07-24 4 views
0

J'ai besoin d'aide pour résoudre mon problème.Rails associations de modèles et méthode de destruction

Je travaille sur un projet où je développe les fonctions du gestionnaire de l'application. Mon problème est lié à deux fonctions Destroy et comment ils se rapportent à eux-mêmes:

Simplifiant, j'ai 3 modèles (Test, Application et JoinTestJob) décrits ci-dessous dans l'exemple de code.

Je souhaite que le gestionnaire puisse détruire l'objet d'un JoinTestJob uniquement s'il est associé aux objets d'une application. J'ai besoin de cohérence dans les objets de l'application. C'est la raison pour laquelle j'ai créé une méthode before_destroy dans le modèle JoinTestJob. Jusqu'à ici fonctionne bien. Je veux aussi que le gestionnaire soit capable de détruire l'objet d'un test, et avec cela, les objets associés devraient aussi être détruits, tel que déclaré dans le modèle de test. Alors, lancez le problème:

Lorsque je supprime un objet Test, je peux voir dans le journal que tous les objets Application associés sont supprimés en premier. Après cela, les objets de JoinTestJob devraient être supprimés, mais j'ai été restauré. Je sais que la raison de la restauration est la méthode before_destroy dans JoinTestJob (je peux la voir dans le journal). Apparemment, cette méthode peut toujours trouver les objets de l'application, même si j'ai vu dans le journal qu'ils ont été supprimés. Dans ce cas, il semble qu'ils seraient vraiment supprimés une fois la transaction terminée. Donc, comment puis-je accomplir pour avoir ces deux fonctionnalités fonctionnelles?

Modèle:

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 

Edit 1:

A propos du journal demandé dans les commentaires, il est vraiment basique. Je vais vous demander d'ignorer certains détails dans l'image. J'ai dû traduire le problème en anglais, donc il y a des mots portugais dans l'image. Ce qu'il est important d'observer dans le journal:

Tous les objets Application liés à Test sont supprimés en premier. Ensuite, lorsque les rails ont commencé à rechercher les objets de JoinTestJob, vous pouvez voir l'annulation. Avant la restauration, il y a une dernière requête de l'application déclenchée par la méthode before_destroy, comme vous pouvez le voir dans l'image du journal. La méthode throw (: abort) est appelée dans cette dernière requête.

Traduction de Word:

Application/applications => Inscricao/inscricaos 

JoinTestJob/join_test_jobs => JoinConcursoCargo/join_concurso_cargos 

Pour clarifier les choses, DadosPessoalCandidato et DadosPortadorDeficiencia sont des modèles associés à l'application et ils détiennent des informations personnelles sur qui demande, comme l'adresse et le téléphone. Ils peuvent être ignorés.

Log img

Edit 2:

Ajout de plus d'informations sur ce qui représentent les modèles, vous les gars peuvent mieux comprendre le problème.

Modèle de test: C'est comme un examen de la fonction publique, où les gens postuler pour obtenir un emploi. Qui obtient le meilleur score à l'examen serait sélectionné pour le travail.Ce modèle tient information: quand cet examen aura lieu, les documents relatifs aux règles de l'examen, lorsque le résultat de l'examen sera libération et etc.

modèle JoinTestJob: Il rejoint le concept d'un emploi et le test qui offrent ces emplois. Ici, nous avons pu trouver des informations comme: la spécificité du travail, comme la période de travail, combien d'heures de travail par jour, salaire, etc

modèle d'application: Ce modèle tient les informations relatives à la personne qui est appliquer pour le travail et le test qui offrent le travail. Ainsi, nous pourrions trouver ici des informations comme: quel travail la personne demande, combien elle a payée pour postuler, la date du test (examen) aura lieu, les informations personnelles comme l'âge, le nom, l'adresse. Une personne peut postuler à plus d'un emploi pour le même test.

J'espère pouvoir vous aider avec ces nouvelles informations.

+0

Pourriez-vous ajouter les journaux à votre question? – Jeremie

Répondre

1

Je pense que vous devriez changer vos modèles:

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 

donc, si un test est détruit, puis applications rapporte avec destroyed test seront détruits, et JoinTestJob se rapporte à destroyed applications sont également détruits.

Je suppose JoinTestJob modèle est stocké dans join_test_jobs modèle et application_id.

Vous pouvez faire champ application_id magasin est NOT NULL au niveau de la base de données, et d'ajouter du code validates :application, presence: true assurez-vous qu'un JoinTestJob a toujours une application associée.

+0

Je modifie ma réponse pour que vous puissiez comprendre un peu plus. Votre réponse est bonne mais elle ne s'appliquait pas à mon cas. Je devrais écrire plus d'informations dans la première fois. Pardon. –