Ruby on rails 如何正确检查ruby中的嵌套值
我有一个ruby哈希,如下所示:Ruby on rails 如何正确检查ruby中的嵌套值,ruby-on-rails,ruby,if-statement,Ruby On Rails,Ruby,If Statement,我有一个ruby哈希,如下所示: payload = { "fields" => { "publishedDate" => { "de"=>"2019-05-02T00:00+02:00" } } } 所以现在我想访问日期。如何高效、正确地编写if语句来检查日期是否存在 我目前正在做类似的事情,但不知怎么的,我觉得代码太多了: payload["fie
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
谢谢你帮助我 假设日期始终是值(以
de
为例),则可以使用访问每个publishedDate
,然后对每个哈希/值使用to和any(&:present?
),以检查给定值中是否有一个不是空的:
在散列中不存在字段和/或publishedDate的最终情况下,它将返回nil,并且您将使用{}来调用值,从而生成一个不存在值的空数组
如果散列来自一个请求参数,那么您必须知道Rails在对象上通过访问调用,并且您的散列键也可以作为符号访问,因此您可以执行以下操作:
(payload.dig(:fields, :publishedDate) || {}).values.any?(&:present?)
您可以将该方法用于。它还将简化您更高级的需求
(payload.dig('fields', 'publishedDate') || {}).values_at('de').any?(&:present?)
通过上述解决方案,您还可以验证特定密钥。您还可以在方法的值中包含多个键,如
(payload.dig('fields', 'publishedDate') || {}).values_at('de', 'month', 'year').any?(&:present?)
. 这应该会有所帮助。您必须执行类似于payload.fetch(:fields,{}).fetch('publishedDate',{})
之类的操作,我不知道dig,但这正是我要找的。非常感谢你,塞巴斯蒂安!是否有一种方法可以挖掘不同的键,如publishedDate和publishAt?或者我真的需要使用多个DIG吗?非常感谢。您可以将dig('fields')
存储在一个变量中,然后检查它们是否存在于哈希中,不过如果您要传递单个键,最好使用[]
。
(payload.dig('fields', 'publishedDate') || {}).values_at('de', 'month', 'year').any?(&:present?)