【问题标题】:Requiring properties in array of hash without looping in Rails需要哈希数组中的属性而不在Rails中循环
【发布时间】:2017-07-18 21:28:42
【问题描述】:

在 Rails 4.2 中,我想验证作为参数传递给我的操作的数组的每个哈希是否具有某些属性。

目前我只能找到如何过滤掉不需要的属性,例如:

ActionController::Parameters.new(
    points: [{lat: 42, foo: 0}, {lng: 43, bar: 100}]
).permit(
    points: [:lat, :lng]
)
# => {"points"=>[{"lat"=>42}, {"lng"=>43}]}

我想做的是确保points 的每个成员都同时拥有latlng 而不必循环它。这可以使用permit 或类似方法吗?

【问题讨论】:

    标签: ruby-on-rails arrays ruby hashmap require


    【解决方案1】:

    有一个名为require 的方法与permit 具有相同的签名:

    params.require(:lat, :lng)
    

    请注意,您可以将其与 permit 链接

    此外,您可以在参数哈希上使用selectreject,无论如何,安全参数主要是糖。

    def my_params
      required_attrs = %w{lat lng}
      missing_params = required_attrs.select do |key|
        params.has_key?(key)
      end
      missing_params.empty? ? params : raise(RuntimeError, "missing params: #{missing_params.join(",")}")
    end
    

    【讨论】:

    • require 不接受多个参数或处理嵌套属性,更不用说在数组中了。您的 my_params 方法(或任何其他检查键是否存在的变体)有效,但它仍然需要我遍历 points 数组
    • 您避免循环的愿望似乎是过早的优化。即使你找到了一些抽象,我几乎可以肯定它仍然会在引擎盖下使用一个循环。您有一个数组,需要检查它的每个元素 - 这至少是 O(N) 时间(因此是一个循环)。此外,来自文档here 是一个使用带有多个参数的require 的示例。
    • 这更多是为了确保不存在为此而不是优化的东西。不过谢谢!
    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多