2011-07-05 5 views
0

I持って、次のコードスニペット保存されない:Railsのデータは

oldroompaxinfo = Roompaxinfo.find(:all, :conditions =>["bkgitem_id = ?",bkgitemid]) 

.... some code to identify which passenger ids have changed 

roompaxinfo = Roompaxinfo.find(:first, :conditions => ["bkgitem_id = ? and roomno = ? and pax_id = ?", bkgitemid, roomno, oldpaxid]) 

roompaxinfo.pax_id = newpaxid 
roompaxinfo.save 

..... some code to send the changes to a remote service. 

#If errors occur during send I want to re-instate the old info 
if retcode.index('Error') != nil 
    oldroompaxinfo.each do |rp| 
     rp.save 
    end 
end 

をそして問題は、コードの最後のビットが戻って古いデータを保存されていないということです。誰かがそれが条件チェックのために実行されていないと思っている場合、私はすでにそれがフラッシュでいくつかのものを出力することによって行うことを証明している。私もrp.saveを試しました!しかしそれはいずれも助けにはなりませんでした。あなたのループを打つとき、私はルビー1.8とRailsとMySQLを使用してい

は2.3.8

+1

development.logは何と言っていますか?それは実行されているSQLクエリを表示しますか? – Dogbert

+0

@Dogbertログには保存しようとしていません。ディランの答えが理由だった。あなたのご意見ありがとうございます。 – nexar

答えて

1

、Railsはそう実際にデータベースには触れていない保存をやって、rpは「汚い」であることを考えていません。 。変更された属性がある場合にのみ、Railsはupdate文を発行します。

あなたは、あなたが望む古いパラメータ(ちょうどpax_id?)を保存rpレコードをリロードした後、保存してくださいする必要があります。

oldroompaxinfo.each do |rp| 
    pax_id = rp.pax_id 
    rp.reload 
    rp.update_attributes(:pax_id => pax_id) 
end 
+0

ご回答ありがとうございます。しかし、別のフォーラムのある人は、サービスに提出するのが失敗した場合は、これをより論理的な方法のように見せて、トランザクション全体を処理してロールバックすることを提案しました。 – nexar