2013-05-15 14 views
4

如何簡化下面的檢查?檢查...簡化的「任意的」有或運營商在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] == [] 

這句法是有點過,但基本上是從所需的一組鍵中減去鍵。如果您的套件中包含所有必需的密鑰,則結果應該爲空。

我不確定關於正確的語法嗎? 。任何幫助,將不勝感激

回答

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

如果你認爲你會使用這個功能的多個地方,你可以擴展哈希類,需要在擴展一個初始化程序。

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)