欢迎来到cool的博客
7

Music box

Click to Start

点击头像播放音乐
新博客链接

update images更新上传多张图片的时候,或者编辑页,一对多创建多条数据,比较优雅的方法。

有两个表一个  users,  一个是  multiple_projects   一个用户有多个项目。

我们在编辑页更新的时候, 每次提交,都是把 该user 对应的所有 projects删除,在重新创建,这样子是很暴力的。我们来用一个优雅的方式来实现。

  def update
    @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
        logger.info "======old_names #{old_names}"
        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
        names_to_be_minus = old_names - new_names
        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 "=====删除该指导员所有附属项目======"
      present_user_projects = MultipleProject.where('user_id = ? ', @user.id)
      present_user_projects.each do |project|
        project.destroy
      end
    end
    flash[:success] = "修改成功"
    redirect_to :back
  end

上面就是就是这个优雅方法的 update action.      新项目数组 和 老项目数组相减,得到的数组再遍历, 多了就增加一个项目, 少了就删除项目。

最常见的就是  一对多 就是 上传多张图片的时候使用。

返回列表