0

我的模型的初始化方法中有以下内容:

@home_phone = contact_hash.fetch('HomePhone')

但是,有时我需要这个:

@home_phone = contact_hash.fetch('number')

此外,有时这些都不是真的,我需要home_phone属性为空。

我怎样才能把它写出来而不像这样创建一个大循环:

if contact_hash.has_key?('HomePhone')
  @home_phone = contact_hash.fetch('HomePhone')
elsif contact_hash.has_key?('number')
  @home_phone = contact_hash.fetch('number')
else 
  @home_phone = ""
end
4

4 回答 4

7

你可以试试

@home_phone = contact_hash.fetch('HomePhone', contact_hash.fetch('number', ""))

或更好

@home_phone = contact_hash['HomePhone'] || contact_hash['number'] ||  ""
于 2013-11-11T21:54:14.890 回答
3
contact_hash.values_at('HomePhone','number','home_phone').compact.first

编辑:

我的第一个解决方案并没有真正给出要求的答案。这是一个修改版本,尽管我认为在只有 3 个选项的情况下,@knut 给出的解决方案更好。

contact_hash.values_at('HomePhone','number').push('').compact.first
于 2013-11-11T22:04:06.443 回答
0

你可以使用values_at我想:

@home_phone = contact_hash.values_at('HomePhone', 'number').find(&:present?).to_s

这并不是很短,但是如果您在数组中有键,那将不方便:

try_these = %w[HomePhone number]
@home_phone = contact_hash.values_at(*try_these).find(&:present?).to_s

您还可以将其包装在某个实用程序方法中或将其修补到Hash.

于 2013-11-11T22:02:26.350 回答
0
def doit(h, *args)
  args.each {|a| return h[a] if h[a]}
  ""
end

contact_hash = {'Almost HomePhone'=>1, 'number'=>7}
doit(contact_hash, 'HomePhone', 'number')  # => 7
于 2013-11-12T00:36:27.147 回答