如何拒绝或仅允许Hash中的某些键?

时间:2016-04-27 20:54:26

标签: ruby-on-rails ruby spree

我有这个方法试图从每个hashie :: mash对象中选择某个字段(每个图像都是一个hashie :: mash对象)但不是全部。

  def images
        images = object.story.get_spree_product.master.images
        images.map do |image|
          {
            position: image["position"],
            attachment_file_name: image["attachment_file_name"],
            attachment_content_type: image["attachment_content_type"],
            type: image["type"],
            attachment_width: image["attachment_width"],
            attachment_height: image["attachment_height"],
            attachment_updated_at: image["attachment_updated_at"],
            mini_url: image["mini_url"],
            small_url: image["small_url"],
            product_url: image["product_url"],
            large_url: image["large_url"],
            xlarge_url: image["xlarge_url"]
          }
        end
      end

有更简单的方法吗?

images是一个hashie :: mash对象的数组。

object.story.get_spree_product.master.images.first.class
Hashie::Mash < Hashie::Hash
[15] pry(#<Api::V20150315::RecipeToolSerializer>)> object.story.get_spree_product.master.images.count
2

1 个答案:

答案 0 :(得分:6)

你在Hash#slice之后:

def images
  images = object.story.get_spree_product.master.images
  images.map do |image|
    image.slice("position", "attachment_file_name", "...")
  end
end

这使您可以将密钥“列入白名单”以包含在返回的哈希中。如果要批准的值多于拒绝,则可以执行相反的操作并仅使用Hash#except列出要拒绝的键。

在任何一种情况下,您可能会发现将允许键列表更容易存储为单独的数组,并使用*将其展开:

ALLOWED_KEYS = %w(position attachment_file_name attachment_content_type ...)

def images
  object.story.get_spree_product.master.images.map do |image|
    image.slice(*ALLOWED_KEYS)
  end
end