加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用Rspec重构Rails模型中的复杂方法?

发布时间:2020-12-17 02:37:20 所属栏目:百科 来源:网络整理
导读:我有以下复杂的方法.我正在努力寻找并实施可能的改进.现在我将最后一条if语句移到了Access类. def add_access(access) if access.instance_of?(Access) up = UserAccess.find(:first,:conditions = ['user_id = ? AND access_id = ?',self.id,access.id]) if
我有以下复杂的方法.我正在努力寻找并实施可能的改进.现在我将最后一条if语句移到了Access类.

def add_access(access)
   if access.instance_of?(Access)
     up = UserAccess.find(:first,:conditions => ['user_id = ? AND access_id = ?',self.id,access.id])
     if !up && company
       users = company.users.map{|u| u.id unless u.blank?}.compact
       num_p = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?',users,access.id])
       if num_p < access.limit
         UserAccess.create(:user => self,:access => access)
       else
         return "You have exceeded the maximum number of alotted permissions"
       end
     end
   end
 end

我想在重构之前添加规范.我先加了一个.怎么看起来像别人?

describe "#add_permission" do
    before do
      @permission = create(:permission)
      @user = create(:user)
    end

    it "allow create UserPermission" do
      expect {
        @user.add_permission(@permission)
      }.to change {
        UserPermission.count
      }.by(1)
    end
  end

解决方法

我就是这样做的.

对Access进行检查更像是初始断言,如果发生这种情况则引发错误.

创建一种新方法来检查现有的用户访问权限 – 这似乎是可重用的,并且更具可读性.

然后,公司限制更像是对我的验证,将其作为自定义验证移至UserAccess类.

class User

  has_many :accesses,:class_name=>'UserAccess'

  def add_access(access)
    raise "Can only add a Access: #{access.inspect}" unless access.instance_of?(Access)

    if has_access?(access)
      logger.debug("User #{self.inspect} already has the access #{access}")
      return false
    end

    accesses.create(:access => access)
  end

  def has_access?(access)
    accesses.find(:first,:conditions => {:access_id=> access.id})
  end

end

class UserAccess

  validate :below_company_limit

  def below_company_limit
    return true unless company
    company_user_ids = company.users.map{|u| u.id unless u.blank?}.compact
    access_count = UserAccess.count(:conditions => ['user_id IN (?) AND access_id = ?',company_user_ids,access.id])
    access_count < access.limit
  end

end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读