Rails 关于 has_many 的用法

easonlovewan · 2015年07月30日 · 最后由 easonlovewan 回复于 2015年07月30日 · 2128 次阅读

需求就是简单的改变当前角色的权限,但感觉这样做不好,代码有待优化 想问一下大神:rails 针对这些循环删除和添加有什么好的解决办法?has_many 好像 有类似的解决办法可不知道怎么处理 注:(我要循环插入的表结构只有两个列:权限 id:permission_id 和修改当前角色权限的:role_id) 需要优化的代码如下:

def update_permission
    per_old_id = [] #修改前角色的所有权限id
    per_new_id = [] #修改后的所有权限id
    params[:permission_id].each{ |id| per_new_id << id.to_i } #得到最新修改过的权限id
    per_old_id = Admin::Role.find(params[:role_id]).permissions.pluck("id") #得到修改之前的权限id
    #添加的save(params[:role_id,list])
    (per_new_id-per_old_id).each do |id|
      Admin::RolePermission.new(:role_id => params[:role_id],:permission_id => id).save
    end
    #删除的save(params[:role_id,list])
    (per_old_id-per_new_id).each do |id|
      Admin::RolePermission.find_by_permission_id_and_role_id(id,params[:role_id]).destroy
    end
    redirect_to :controller => "permissions",:action => "update_permission_by_role"
  end
Admin::RolePermission.where(permission_id: (per_old_id-per_new_id), role_id: params[:role_id]).destroy_all

不过感觉你的设计有问题

#2 楼 @kikyou做到现在我也感觉到这样设计有问题,不过内部人用,还行!

#1 楼 @kikyous 感谢🙏不过,对于上边儿的 save 操作还有什么可优化的地方吗?

#4 楼 @easonlovewan 如果要插入的记录不多,save 就不用优化了,因为 rails 没有提供一次插入多条记录的方法。 如果插入的数据比较多,用这个https://github.com/zdennis/activerecord-import

#5 楼 @kikyous activerecord-import 会忽略 callback 和 validations

感觉确实可以重构下,理想的情况下是能够直接 update 原有 table 里面的 permission 的值,而不是在这里做添加和删除来达到 update 操作的效果。当然这还要看你们自己结构和表的结构再决定。还有可以注意下变量的命名。例如数组的命名:per_old_id --> all_old_ids

#7 楼 @jackxu 嗯嗯,先这样做吧,以后有时间肯定会重构的,内部人用感觉可以了!字段命名一直是我的硬伤,一定改正!!!

Admin::Role.find(params[:role_id]).permissions = Admin::Permission.where(id: params[:permission_id].blank? ? [] : params[:permission_id].map(&:to_i)) 问题已经解决一行 code 搞定!!! 用了 has_many 相关的一个方法 (collection=objects)

重新修复一下 code: Admin::Role.find(params[:role_id]).permissions = Admin::Permission.where(id: params[:permission_id]) 那块儿不用做非空判断的!!!rails 会自行处理的!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号