【问题标题】:How to correctly check for nested values in ruby如何正确检查 ruby​​ 中的嵌套值
【发布时间】:2020-07-07 00:27:59
【问题描述】:

我有一个如下所示的 ruby​​ 哈希:

payload = {
  "fields" => {
    "publishedDate" => {
      "de"=>"2019-05-02T00:00+02:00"
    }
  }
}

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

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

payload["fields"] && payload["fields"]["publishedDate"] && payload["fields"]["publishedDate"].first && payload["fields"]["publishedDate"].first.last

谢谢你帮助我!

【问题讨论】:

标签: ruby-on-rails ruby if-statement


【解决方案1】:

假设日期始终是值(以de 为例),那么您可以使用dig 访问每个publishedDate,然后使用Hash#values 访问每个哈希/值,使用any?(&:present?) 进行检查如果任何给定值不是空白

(payload.dig('fields', 'publishedDate') || {}).values.any?(&:present?)

如果字段和/或 publishedDate 最终不存在于哈希中,它将返回 nil,并且您将使用 {} 来调用值,从而产生一个没有 @987654329 的空数组@ 值。

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

(payload.dig(:fields, :publishedDate) || {}).values.any?(&:present?)

【讨论】:

  • 不知道 dig 但这正是我想要的。非常感谢塞巴斯蒂安!
  • 还有没有办法挖掘不同的键,比如publishedDate和publishAt?还是我确实必须为此使用多次挖掘?谢谢!
  • 您可以将dig('fields') 存储在一个变量中,然后检查它们是否存在于您的哈希中,但如果您传递一个key,最好使用[] .
【解决方案2】:

您可以将values_at 方法与dig 一起使用。它还将简化您更高级的需求。

(payload.dig('fields', 'publishedDate') || {}).values_at('de').any?(&:present?)

通过上述解决方案,您还可以验证您的特定密钥。您还可以在 values_at 方法中包含多个键,例如

(payload.dig('fields', 'publishedDate') || {}).values_at('de', 'month', 'year').any?(&:present?)

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多