从操作中回滚模型更改
Rolling back Model-changes from action
我有操作,我将组分配给申请的成员。基本上,我只是从表单的视图中获取电子邮件列表,然后我可以采取行动来捕捉它:
我想知道的是,如果我可以回滚已经进行的更改,如果说第二个成员不存在,或者已经有一个组,我该如何回滚这些?
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
我已经想到了,把v.save
和@group.save移到最后,再做一个params[:member].each....
的循环,但是这样就很浪费了的资源,根据需要执行 find_by_email-method 两倍的次数。
我建议将您的非控制器逻辑移动到模型中并将其包装在 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
使用事务作为 SQL 语句的保护包装,以确保仅当所有操作一起成功时才对数据库进行更改。
我有操作,我将组分配给申请的成员。基本上,我只是从表单的视图中获取电子邮件列表,然后我可以采取行动来捕捉它:
我想知道的是,如果我可以回滚已经进行的更改,如果说第二个成员不存在,或者已经有一个组,我该如何回滚这些?
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
我已经想到了,把v.save
和@group.save移到最后,再做一个params[:member].each....
的循环,但是这样就很浪费了的资源,根据需要执行 find_by_email-method 两倍的次数。
我建议将您的非控制器逻辑移动到模型中并将其包装在 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
使用事务作为 SQL 语句的保护包装,以确保仅当所有操作一起成功时才对数据库进行更改。