为这三种方法编写通用方法

问题描述

| 我有一个这样的模型用户
class User

  ROLES = {
            \"Admin\" => 1,\"Manager\" => 2,\"Officer\" => 3
          }

  def admin?
    role == 1
  end

  def manager?
    role == 2
  end

  def officer?
    role == 3
  end

end
其中“ 1”是“ 2”表中的一列,我想知道是否可以使用通用方法从“ 3”散列构建三种角色检查方法? 编辑 所以这似乎是答案
class User

  ROLES = {
            \"Admin\" => 1,\"Officer\" => 3
          }

  # methods used to identify whether a user is a specific role
  ROLES.each { |k,v| define_method(\"#{k.downcase}?\") { role == v } }

end
    

解决方法

        我不确定您的意图,但也许是这样吗?
class User
  %w[admin manager officer].each_with_index{|m,i| define_method(\"#{m}?\"){role == i+1}}
end
或者,使用
ROLES
class User
  ROLES.each{|m,i| define_method(\"#{m.downcase}?\"){role == i}}
end
    ,        我认为有两种选择。 首先,您可以添加method_missing实现,以检查该方法是否是您的角色名称之一。就像是:
def method_missing?(sym,*args)
  if args.empty? && ROLES.any? { |r| r.downcase + \"?\" == sym.to_s }
    # No additional arguments and the symbol for the method called 
    # matches a role name
    role == ROLES[sym.to_s.chomp(\'?\')] # Check the value
  else
    super
  end
end
另外,您可以从角色哈希中设置方法:
class User
  ROLES = { ... }
  ROLES.each_pair do |r,n|
    class_eval \"def #{r.downcase}?; role == #{n}; end\"
  end
end
    ,        大概有几种不同的方法可以实现,问题是,您希望它如何表现,以及在哪里希望使用方便/灵活? 如果我了解您要做什么,这样的事情可能会有所帮助
def to_methods(roles_hash)
  roles_hash.each_pair do |key,value|
    class_eval {
      \"def #{key}?
         role == #{value}
       end\" 
    }
  end
end
这将为您创建每个角色的方法。这就是您想要做的吗?     ,        我想你可以做这样的事情,但我认为你的方法读起来更好。
  (ROLES = {
    \"Admin\"   => 1,\"Manager\" => 2,\"Officer\" => 3,}).each { |k,v| define_method(k.downcase + \'?\') { role == v }}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...