2010-07-15 4 views
0

J'ai une relation un-à-plusieurs de Traitement à Coût. La raison en est que, pour les besoins de la facturation et de l'impôt, nous devons tenir un registre des changements de prix pour un traitement. Donc ceci est implémenté en disant que le coût est égal à l'entrée de coût la plus récente associée à ce traitement.Mise à jour du modèle un-à-plusieurs Ro

Cette fonctionnalité doit être complètement transparente pour l'utilisateur, ils ne devraient rien savoir sur les coûts historiques, juste qu'il y en a un en cours. Donc, quand ils frappent edit, et font une mise à jour, si le coût du traitement devait changer, je veux ensuite mettre à jour le tableau des coûts aussi. Le problème que j'ai est avec les modèles étant représentés dans une forme.

<% form_for([:admin, @treatment]) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </p> 
    <p> 
    <%= f.label :duration %><br /> 
    <%= f.text_field :duration %> 
    </p> 
    <p> 
    <%= f.submit 'Save' %> 
    </p> 
<% end %> 

donc le traitement has_many: coût dans le modèle, et sous cette forme que je veux avoir le champ des coûts avec le dernier coût en elle. Pour commencer, comment je fais ça? De plus, comment mettre à jour le modèle de coûts si le coût a changé? Je suppose que c'est fait dans le contrôleur, mais si j'ai un text_field pour le coût, comment puis-je le dissocier avec le modèle @treatment?

Vive

Répondre

0

j'ai eu un problème similaire, donc j'eu mon association has_many mais j'eu une association has_one qui pointait vers la version la plus récente.

REMARQUE: J'utilise MSSQL, votre syntaxe peut donc être légèrement différente.

class Treatment < ActiveRecord::Base 
    has_many :costs 
    has_one :current_cost, :class_name => "Cost", 
         :conditions => "costs.id = (SELECT MAX(c.id) 
                  FROM costs c 
                  WHERE c.treatment_id = costs.treatment_id)" 
end 

J'ai commencé avec ceci:

class Treatment < ActiveRecord::Base 
    has_many :costs 

    def current_cost 
    self.costs.last(:order => "id") 
    end 
end 

Mais après il a obtenu assez grand, je avais besoin pour minimiser les trempettes de base de données et cela a été un goulot d'étranglement devenais.

Si vous aviez la possibilité de définir un champ enabled dans le modèle de coûts et d'utiliser une validation pour garantir qu'un seul coût est activé par traitement. Alors je recommanderais:

class Treatment < ActiveRecord::Base 
    has_many :costs 
    has_one :current_cost, :class_name => "Cost", :conditions => ["costs.enabled = ?", true] 
end 

J'espère que ceci aide!

+0

Je vais avoir un coup à ce soit ce soir ou le week-end quand je suis à la maison :) – Kezzer

Questions connexes