2014-06-17 6 views
1

J'ai deux modèles différents: les patients et les échantillons. Un patient peut avoir plusieurs échantillons et un échantillon appartient à un patient.Mettre à jour un autre attribut du modèle après enregistrement

est ici les deux modèles simplifiés (avec seulement les informations que j'ai besoin pour ce problème ...):

class Sample < ActiveRecord::Base 
attr_accessible :dateOfSample, :patient_attributes, :infantBreastFeedingAtThisTime, :typeBreastFeedingAtThisTime, :idadeDesmameAtThisTime 

belongs_to :patient 
accepts_nested_attributes_for :patient 
end 

Et le modèle du patient:

class Patient < ActiveRecord::Base 

    attr_accessible :date_of_birth, :infant_name, :infantBreastFeeding, :typeBreastFeeding,:idadeDesmame 
    has_many :samples 
end 

Ce que je veux faire est, Chaque fois qu'un Sample est créé ou mis à jour, si "dateOfSample" est le dernier échantillon disponible, je veux mettre à jour les attributs du patient (: infantileBreastFeeding,: typeBreastFeeding,: idadeDesmame) avec les derniers attributs d'échantillon particuliers (: infantileBreastFeedingAtThisTime,: typeBreastFeedingAtThisTime,: idadeDesmameAtThisTime)

Comment puis-je faire cela dans le modèle d'échantillon? Utiliser after_save? J'ai essayé mais je ne pouvais pas passer les attributs du patient donc il n'a pas reconnu le patient ... Cela devrait être une simple erreur que je commets, encore des rails noob :)

Merci!

UPDATE:

j'ai une forme d'insérer des échantillons/de mise à jour. À l'intérieur de ce formulaire, j'ai un partiel pour les champs patients (nom et date de naissance). Désolé de ne pas poster le formulaire mais il est trop grand ...

+0

Les échantillons seront-ils toujours ajoutés en tant qu'attributs imbriqués du formulaire patient? –

+0

Non, j'ai un formulaire avec "patient_id" dessus, et je montre quelques autres attributs du patient. Mais oui, jamais je crée ou met à jour un échantillon, il doit avoir des attributs patient – lbramos

+0

Votre réponse à ma question est confuse, alors pourriez-vous s'il vous plaît ajouter le formulaire dont vous parlez à votre question? –

Répondre

1

Vous pouvez vous y prendre de différentes manières. Tout d'abord, vous pouvez essayer une méthode after_save comme suit:

class Sample < ActiveRecord::Base 
    after_save :update_patient 

    def update_patient 
    if self.class.where(patient: self.patient).maximum(:dateOfSample) == self.dateOfSample 
     self.patient.update_attributes(infantBreastFeeding: infantBreastFeedingAtThisTime, 
            typeBreastFeeding: typeBreastFeedingAtThisTime, 
            idadeDesmame: idadeDesmameAtThisTime) 
    end 
    end 
end 

Deuxièmement, vous pouvez définir les attributs de votre contrôleur sur une mise à jour ou créer.

class SamplesController < ApplicationController 
    # call this in both your create and update methods before you save 
    def assign_sample_attributes_to_product   
    if Sample.where(patient: @sample.patient).maximum(:dateOfSample) < @sample.dateOfSample) 
     @sample.assign_attributes(infantBreastFeeding: @sample.infantBreastFeedingAtThisTime, 
           typeBreastFeeding: @sample.typeBreastFeedingAtThisTime, 
           idadeDesmame: @sample.idadeDesmameAtThisTime) 
    end 
    end 
end 

Espérons que cela vous aide!

+0

J'ai essayé l'option 1 et j'ai: ArgumentError: faux nombre d'arguments (1 pour 0), liés à "max" – lbramos

+0

Oups désolé! Cela devrait être 'maximum', pas' max'. Je les fais toujours mélanger. J'ai mis à jour ma réponse. –

+0

Merci, ça marche! Je cherchais une alternative au max mais tu me bats :) J'ai adoré ta solution, le code est bien plus propre et élégant que ce que j'essayais d'écrire! – lbramos

Questions connexes