2017-02-24 22 views
1

db.Iに格納するデータを含むexcelシートを持っていて、excelシートのデータを正常に挿入したと仮定します。ここで検証しようとしています。私のExcelシート想定 :私はこのシートをアップロードするときexcelシートのデータをrorに格納

s.no name age 
1 abc  12 
2 def  qwer 
3 asd  23 

を、2行のデータは、ロール・バックし、1,3行のデータがDBに格納されています。 私がやろうとしているのは、ロールバック操作が発生し、残りのレコードがdb.i.eに格納されてはならないということです。行3のデータは、行2がロールバックされたときに格納されるべきではありません。

更新: ここでは、コントローラの私のコードです:私は、全体のバックロールする

def fetch_excel_data 

ex = Roo::Excel.new("/desktop/abc.xls") 
ex.default_sheet = ex.sheets[0] 
2.upto(ex.last_row) do |line| 
    name = ex.cell(line,2) 
    age = ex.cell(line,ex.last_column) 
    byebug 
    @product = Product.create(:name => name,:age => age) 
    @product.save! 
    flash[:success] = "data is stored successfully" 
end 
end 

だけでなく、シートをエクセルそうする方法はありrecords..Is?

任意のレコードをさらにレコードを

のような何かを保存しないこと有効でない場合は、ループを破ることができる

+0

シートの解析と挿入に使用しているコードを表示できますか? – Nobita

+0

さらなるレコードを保存しないレコードが有効でない場合は、ループを解除することができます –

答えて

1

CSV.foreach("file.csv", headers: true) do |row| 
    user = User.new(name: row['name'], age: row['age']) 
    break unless user.valid? 
    user.save 
end 

EDIT:あなたができる@Rais提案からの助けを取る

このようなことをしてください。

User.transaction do 
    CSV.foreach("file.csv", headers: true) do |row| 
    User.create!(name: row['name'], age: row['age']) 
    end 
end 
+0

これは、次のレコードをロールバックしたい場合に機能します。しかし、私はシート全体をロールバックしたいと思います。それに対して何か解決策はありますか?@Deepak – Harshini

0

だけ追加して、あなたが

取引documentation-レールAPIからの引用ActiveRecord Transactions

を使用して原子性を達成することができますが、彼らはすべて1つのアトミックアクションとして成功できるかどうSQL文が唯一 永続的に保護ブロックです。古典的な の例は、引き出しが成功した場合には の預金しか持てない2つの口座間の振替です。逆の場合も同様です。トランザクション は、データベースの整合性を強化し、プログラムのエラーまたはデータベースのブレークダウンを防ぐためにデータを保護します( )。したがって、 トランザクションブロックは、 を一緒に実行するか、まったく実行しないでください。例えば

: 撤退や堆積物でもないが、例外を発生させる場合

ActiveRecord::Base.transaction do 
    david.withdrawal(100) 
    mary.deposit(100) 
end 

この例では唯一のデビッドからお金を取るとメアリーにそれを与えるだろう。例外は トランザクションを開始する の前の状態にデータベースを返すROLLBACKを強制します。ただし、オブジェクトには のインスタンスデータがトランザクション前の状態に戻らないことに注意してください。

+0

'Model.create'で作業していません –

+1

ああ、' create! ' –

関連する問題