使用Ruby中的or-operator简化“任意”检查

如何简化以下检查?…

if node[:base][:database][:adapter].empty? || node[:base][:database][:host].empty? || node[:base][:database][:database].empty? || node[:base][:database][:port].empty? 

喜欢的东西

 required_keys = { :adapter, :host, :database...etc...} required keys - node[:base][:database] == [] 

这种语法略有不同,但基本上从所需的密钥集中减去了你的密钥。 如果您的集合中包含所有必需的键,则结果应为空。

我不确定正确的语法? 。 任何帮助,将不胜感激

 required_keys = [:adapter, :host, :database ] if required_keys.any?{|x| node[:base][:database][x].empty?} #code here end 

或者你也可以这样做:

 node[:base][:database].values_at(*required_keys).any?(&:empty?) 

如果您认为您将在多个位置使用此function,则可以扩展Hash类并在初始化程序中要求扩展。

 class Hash def contains_values_for?(*keys) keys.all? do |key| self[key].present? end end end 

现在你可以这样做:

 node[:base][:database].contains_values_for?(:adapter, :host, :database, :port)