如何解决为这三种方法编写通用方法
| 我有一个这样的模型用户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 }}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。