2016-04-15 2 views
1

Ich habe die Aktion, in der ich den Mitgliedern Gruppen zuweisen, die zutreffen. Im Grunde bekomme ich nur eine Liste von E-Mails, von der Ansicht in einem Formular, und dann habe ich die Aktion, um es zu fangen:Zurückrollen Modelländerungen von Aktion

Was ich frage mich ist, dass, wenn ich die Änderungen, die bereits gemacht wurde, Rollback, Wenn das zweite Mitglied nicht existiert oder bereits eine Gruppe hat, wie kann ich diese zurücksetzen?

def group_create 
    @group = Group.new 
    params[:member].each { |m| 
    v = Volunteer.find_by_email(m[1]) 
    raise "#{m[1]} doesn't exist" unless v.present? 
    raise "#{v.email} is already in a group" if v.group.present? 
    v.group = @group 
    v.save! 
    } 
    @group.save 
rescue => error 
    flash[:error] = "Error: #{error}" 
ensure 
    respond_to do |format| 
    unless flash[:error].present? 
     flash[:notice] = 'Group Application succeded.' 
     flash[:joined] = true 
     format.html { redirect_to apply_group_path } 
    else 
     flash.discard 
     format.html { render :group } 
    end 
    end 
end 

Was habe ich schon darüber nachgedacht, war die v.save und @ group.save bis zum Ende bewegen, und machen eine weitere Schleife von params[:member].each...., aber das wäre durchaus eine Verschwendung von Ressourcen, werden die find_by_email- zu tun Methode zweimal so oft wie nötig.

Antwort

2

Ich schlage vor, Ihre Nicht-Controller-Logik in Modell bewegen und wickeln Sie es in ActiveRecord::Base.transaction:

ActiveRecord::Base.transaction do 
    @group = Group.new 
    params[:member].each { |m| 
     v = Volunteer.find_by_email(m[1]) 
     raise "#{m[1]} doesn't exist" unless v.present? 
     raise "#{v.email} is already in a group" if v.group.present? 
     v.group = @group 
     v.save! 
    } 
    @group.save 
end 

Verwenden Transaktionen als Schutz Wrapper um SQL-Anweisungen Änderungen an der Datenbank, um sicherzustellen, nur auftreten, wenn alle Aktionen zusammen Erfolg haben.

+0

Also, eine Group.assign_members machen, die ein Array von E-Mails oder etwas in diese Richtung nimmt? –

Verwandte Themen