重构 rails 模型以从条件中删除字符串文字

Refactoring rails model to remove string literals from condition

我每次启动服务器时都会收到一条警告,提示我的条件中有字符串文字。这是什么意思,我该如何改进我的代码来解决这个问题并停止收到警告?

  def partner_cars
    if self.role == 'Garage Employee' || self.role == 'Garage Manager'
      self.cars
    elsif self.role == 'Company Employee' || 'Company Manager'
      self.company.cars
    else
      nil
    end
  end

  def partner_users
    if self.role == 'Garage Employee' || self.role == 'Garage Manager'
      allowed_users = self.users
    elsif self.role == 'Company Employee' || 'Company Manager'
      allowed_users = self.company.users
    else
      allowed_users = nil
    end
    allowed_users.uniq
  end

任何有关如何重构此代码的帮助将不胜感激,谢谢!

在不了解您的数据结构的情况下,很难提出重构方法。

def partner_cars
  if garage_roles.include?(self.role)
    ...some code
  elsif employee_roles.include?(self.role)
    ..some code
  end
end

private
def garage_roles
  ['Garage Employee', 'Garage Manager']
end

更好的方法是在您的角色模型中设置这些方法。

class Role
  def works_for_garage?
    title == 'Garage Manager' || 'Garage Employee'
  end
end

错误来自行 elsif self.role == 'Company Employee' || 'Company Manager'。相反,它应该是 elsif self.role == 'Company Employee' || self.role == 'Company Manager'.

但是,我会重构您的代码以使用如下 case 语句:

def partner_cars
  case role
    when 'Garage Employee', 'Garage Manager' then cars
    when 'Company Employee', 'Company Manager' then company.cars
  end
end

def partner_users
  allowed_users =
    case role
      when 'Garage Employee', 'Garage Manager' then users
      when 'Company Employee', 'Company Manager' then company.users
    end
  allowed_users.try(:uniq)
end