update images更新上传多张图片的时候,或者编辑页,一对多创建多条数据,比较优雅的方法。
有两个表一个 users, 一个是 multiple_projects 一个用户有多个项目。
我们在编辑页更新的时候, 每次提交,都是把 该user 对应的所有 projects删除,在重新创建,这样子是很暴力的。我们来用一个优雅的方式来实现。
def update
@user.update(user_params)
@user.update(user_params)
if params[:multiple_project].present?
User.transaction do
#old_ids = MultipleProject.where('user_id = ? ', @user.id).map(&:project_name)
#上这个是下面这个的简写
old_names = MultipleProject.where('user_id = ? ', @user.id).map{ |multiple_project|
multiple_project.project_name
}
new_names = params[:multiple_project]
names_to_be_added = new_names - old_names
User.transaction do
#old_ids = MultipleProject.where('user_id = ? ', @user.id).map(&:project_name)
#上这个是下面这个的简写
old_names = MultipleProject.where('user_id = ? ', @user.id).map{ |multiple_project|
multiple_project.project_name
}
new_names = params[:multiple_project]
names_to_be_added = new_names - old_names
logger.info "======old_names #{old_names}"
logger.info "======new_names #{new_names}"
logger.info "=====增加了项目:#{names_to_be_added}======"
logger.info "======new_names #{new_names}"
logger.info "=====增加了项目:#{names_to_be_added}======"
names_to_be_added.each do |name|
MultipleProject.create :user_id => @user.id, :project_name => name
end
MultipleProject.create :user_id => @user.id, :project_name => name
end
names_to_be_minus = old_names - new_names
logger.info "======减少的项目:#{names_to_be_minus}======"
logger.info "======减少的项目:#{names_to_be_minus}======"
names_to_be_minus.each do |name|
delete_project = MultipleProject.where("project_name = ? and user_id = ?", name, @user.id).first
delete_project.destroy
end
end
else
logger.info "=====删除该指导员所有附属项目======"
delete_project = MultipleProject.where("project_name = ? and user_id = ?", name, @user.id).first
delete_project.destroy
end
end
else
logger.info "=====删除该指导员所有附属项目======"
present_user_projects = MultipleProject.where('user_id = ? ', @user.id)
present_user_projects.each do |project|
project.destroy
end
end
present_user_projects.each do |project|
project.destroy
end
end
flash[:success] = "修改成功"
redirect_to :back
end
end
上面就是就是这个优雅方法的 update action. 新项目数组 和 老项目数组相减,得到的数组再遍历, 多了就增加一个项目, 少了就删除项目。
最常见的就是 一对多 就是 上传多张图片的时候使用。