Упрощение проверки "любого из" с помощью оператора or в Ruby

Как упростить следующую проверку?...

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] == [] 

Этот синтаксис немного отличается, но в основном вычитает имеющиеся у вас ключи из набора необходимых ключей. Если у вас есть все необходимые ключи в вашем наборе, результат должен быть пустым.

Я не уверен относительно правильного синтаксиса?, Любая помощь будет оценена

2 ответа

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?) 

Если вы думаете, что собираетесь использовать эту функцию в нескольких местах, вы можете расширить класс 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)
Другие вопросы по тегам