2010-06-13 6 views
0

J'essaie actuellement d'enregistrer des informations pour une facture/facture. Sur la facture, je veux montrer quel est le prix total. Les procédures & articles, leur prix et la quantité. Donc à la fin, je l'espère pour l'obtenir à ressembler à ceci:Rails: Comment désérialiser de la base de données?

Consult [date] [total_price] 
     Procedure_name [price] [qty] 
     Procedure_name [price] [qty] 
    Consult [date] [total_price] 
     Procedure_name [price] [qty] 
    etc... 

Toutes ces informations sont disponibles dans la base de données, mais je veux enregistrer les informations comme une copie distincte. De cette façon, si l'utilisateur modifie le prix de certaines procédures, les informations de facturation sont toujours correctes. Je pensais que je ferais cela en sérialisant et enregistrer les données dans une colonne (consult_data) dans la table Facture.


Mon modèle:

class Invoice < ActiveRecord::Base 
    ...stuff... 
    serialize :consult_data 
    ... 
end 

Voici ce que je reçois de la forme (1 consulter et 3 procédures):

{"commit"=>"Save draft", "authenticity_token"=>"MZ1OiOCtj/BOu73eVVkolZBWoN8Fy1skHqKgih7Sbzw=", "id"=>"113", "consults"=>[{"consult_date"=>"2010-02-20", "consult_problem"=>"ABC", "procedures"=>[{"name"=>"asdasdasd", "price"=>"2.0", "qty"=>"1"}, {"name"=>"AAAnd another one", "price"=>"45.0", "qty"=>"4"}, {"name"=>"asdasdasd", "price"=>"2.0", "qty"=>"1"}], "consult_id"=>"1"}]} 

Mon action de sauvegarde:

def add_to_invoice 
    @invoice = @current_practice.invoices.find_by_id(params[:id]) 
    @invoice.consult_data=params[:consults] 
    if @invoice.save 
    render :text => "I think it worked" 
    else 
    render :text => "I don't think it worked'" 
    end 
    end 

Il enregistre dans la base de données et si je regarde le en essayez de la console je peux voir qu'il est tout ce qu'il ya:

consult_data: "--- \n- !map:HashWithIndifferentAccess \n consult_da..." 

(--- La question ---) Mais je ne peux pas couture pour récupérer mes données. J'ai essayé de définir une variable à l'attribut consult_data et ensuite de faire "variable.consult_problem" ou "variable [: consult_problem]" (aussi essayé de boucler) mais cela ne me renvoie que des erreurs sans méthode. Comment puis-je désérialiser les données de la base de données et les restituer dans le hachage que je peux utiliser?


Merci beaucoup pour toute aide!

Répondre

1

Je pense que vous devez déterminer la classe d'objet

IE:

serialize :consult_data, Hash 

Alors

invoice = Invoice.last 
invoice.consult_data[:date] # will return date 

etc

+0

Ok je l'ai essayé. Lorsque je l'ai comme "serialize: consult_data, Hash" et essayez d'enregistrer je reçois ceci, en essayant d'enregistrer: "consult_data était censé être un Hash, mais était un tableau" ----- Puis J'ai essayé "serialize: consult_data, Array" Et ça marche! ----- Et parce que c'était un tableau (qui pourrait avoir plusieurs consultations), j'ai aussi dû définir celui que je voulais. "invoice.consult_data [0] [: consult_date] #does retourne la date" ---- YAY! Merci beaucoup. – Macint

Questions connexes