ROR 级联部门设计及应用

ROR 级联部门设计
设计要点:has_many,belongs_to
支持添加子部门,欢迎大家前来拍砖!

使用方法:
@parent_depart.add_child(@child_depart)
@parent_depart.add_child(@child_depart2)
assert @child_depart.is_child?(@parent_depart)
assert @child_depart2.is_child?(@parent_depart)
assert @parent_depart.is_parent?(@child_depart)
assert @parent_depart.is_parent?(@child_depart2)


class User::Department < ActiveRecord::Base
  #设置表名
  set_table_name("user_"+self.table_name)


  ##
  #设置表间关系
  belongs_to :parent, :class_name => 'User::Department',
 :foreign_key => 'parent_id'  #父部门
  has_many :subs, :class_name => 'User::Department', 
 :foreign_key =>'parent_id'
 ,:conditions=>["status=?",STATUS_NORMAL]    #子部门
  has_one :creator, :class_name => 'User::User' #部门创建人

  ##
  #验证信息
  validates_presence_of :name, :message => "部门名称不能为空!"
  validates_presence_of :institution_id, :message => "绑定机构不能为空!"

  ##
  #实例方法

  #功能:添加子部门
  def add_child(child)
    child.parent_id = self.id
    child.save!
  end

  #功能:删除子部门
  #备注:删除子部门在最上层
  def remove_child (child)
    child.parent_id = 0
    child.save!
  end

  #功能:删除部门
  #流程:
  #      :1.判断是否有子部门 ,如果有不能删除
  #       : 2.更新部门状态-已删除
  def delete!
    if self.subs.blank?
      self.status = STATUS_END
      self.save!
    else
      raise "该部门包含子部门不能删除!"
    end
  end

  #功能:判断是否为父节点
  def is_child?(parent)
    self.parent_id == parent.id
  end

  #功能:判断是否为子节点
  def is_parent?(child)
    child.parent_id == self.id
  end

  #功能:获得该部门用户
  #返回:用户集合
  def member()
    User::User.find(:all, :conditions=>["department_id=?", self.id])
  end

  ##
  #类方法
  class << self

    #功能:顶级部门
    #参数列表 :机构
    #返回:最上层部门
    def top_department(institution)
      self.find(:all, :conditions=>["parent_id=0 and status=?
            and institution_id=?", STATUS_NORMAL, institution.id])
    end

  end

end

你可能感兴趣的:(Ruby,ActiveRecord)