2012-03-24 3 views
0

Ich habe diesen Code, wie Sie sehen können, habe ich zwei params. Und ich erstelle in der einen Tabelle neue Felder, in einer anderen Tabelle Felder.Rails 3 + Transaktionen: wie funktionieren sie?

Ich muss sie in MySQL einfügen. Alles ist cool, aber ich habe eine Frage: Wie mache ich eine Transaktion, weil ich nicht nur eine von ihnen in die Datenbank einfügen will (update oder create). Weil jetzt, wenn ich ein params füllte, die Tabelle ot aktualisiert wird, aber ich möchte sie ALLE in der Datenbank bei EINMAL setzen. Meine Frage ist also, wie man eine Transaktion durchführt, um das Einfügen eines von ihnen zu vermeiden?

json_grid_params = ActiveSupport::JSON.decode(params[:grid_json]) 
json_form_params = ActiveSupport::JSON.decode(params[:form_json]) 

    json_grid_params.each do |json_grid_params| 
    report  = Report.find(:all, :conditions => ["wat_id in (?)", json_grid_params["wat_id"].to_i]) 

     report.each do |r| 
      rr = r.update_attributes(:percent_money => json_grid_params["percent_money"], 
            :percent_item => json_grid_params["percent_item"], 
            :trend   => json_grid_params["trend"]) 
     end 

     form = FormAnswer.create(json_form_params) 

aktualisiert:

ActiveRecord::Base.transaction do 
    json_grid_params = ActiveSupport::JSON.decode(params[:grid_json]) 
    json_form_params = ActiveSupport::JSON.decode(params[:form_json]) 
      json_grid_params.each do |json_grid_params| 
     report = Report.find(:all, :conditions => ["wat_id in (?)", json_grid_params["wat_id"].to_i]) 
      report.each do |r| 
       rr = r.update_attributes(:percent_money => json_grid_params["percent_money"], 
          :percent_item => json_grid_params["percent_item"], 
          :trend   => json_grid_params["trend"]) 
      rr.save! 
      form = FormAnswer.create(json_form_params) 
      #form.save! 
      end 
     end 
end 

und in Protokoll haben diesen Fehler:

NoMethodError (undefined method `save!' for true:TrueClass): 
    app/components/report_grid.rb:122:in `block (4 levels) in <class:ReportGrid>' 
    app/components/report_grid.rb:118:in `each' 
    app/components/report_grid.rb:118:in `block (3 levels) in <class:ReportGrid>' 
    app/components/report_grid.rb:116:in `each' 
    app/components/report_grid.rb:116:in `block (2 levels) in <class:ReportGrid>' 
    app/components/report_grid.rb:113:in `block in <class:ReportGrid>' 

Rendered /home/parallels/.rvm/gems/[email protected]ls314/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.7ms) 
Rendered /home/parallels/.rvm/gems/[email protected]/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.8ms) 
Rendered /home/parallels/.rvm/gems/[email protected]/gems/actionpack-3.1.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (2.8ms) 

Antwort

0
ActiveRecord::Base.transaction do 
    ... 
end 

wird wickeln Sie den Block in einer Transaktion (If i grid_params leer lassen). Wenn einige Ihrer Modelle über unterschiedliche Datenbankverbindungen verfügen, rufen Sie die Transaktion für diese bestimmte Klasse auf, damit die Transaktion auf der richtigen Verbindung ausgeführt wird.

+0

UPDATE: schau meinen Code, ich habe aktualisiert. –

+0

das funktioniert nicht in meinem Fall :(nicht wissen, –

+0

rr.update_attributes speichert es sofort und gibt True zurück. Sie versuchen dann zu speichern! Auf True, die ungültig ist. Siehe http://apidock.com/rails/ActiveRecord/ Basis/update_attributes – DGM