如何正确检查ruby中的嵌套值

And*_*pel 2 ruby if-statement ruby-on-rails

我有一个看起来像这样的 ruby​​ 哈希:

payload = {
  "fields" => {
    "publishedDate" => {
      "de"=>"2019-05-02T00:00+02:00"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我想访问日期。我如何有效且正确地编写 if 语句来检查日期是否存在?

我目前正在做这样的事情,但不知何故感觉它的代码太多:

payload["fields"] && payload["fields"]["publishedDate"] && payload["fields"]["publishedDate"].first && payload["fields"]["publishedDate"].first.last
Run Code Online (Sandbox Code Playgroud)

谢谢你帮我解决!

Seb*_*lma 6

假设日期始终是值(以 为例de),那么您可以使用dig到达 every publishedDate,然后到达Hash#values每个散列/值并any?(&:present?)检查是否有任何给定值不为

(payload.dig('fields', 'publishedDate') || {}).values.any?(&:present?)
Run Code Online (Sandbox Code Playgroud)

在哈希中不存在字段和/或已发布日期的最终情况下,它将返回 nil,并且您将使用 {} 调用值,从而产生一个没有present?值的空数组。

如果哈希来自请求参数,您必须知道 Rails 调用with_indifferent_access对象,并且您的哈希键也可以作为符号访问,因此您可以这样做:

(payload.dig(:fields, :publishedDate) || {}).values.any?(&:present?)
Run Code Online (Sandbox Code Playgroud)