微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Grape Entity 中公开哈希而不使用 `using`

如何解决如何在 Grape Entity 中公开哈希而不使用 `using`

我有这个实体。

class EmpEntity < Grape::Entity
  expose :id
  expose :age
  expose :name do
    expose :firstname
    expose :lastname
    expose :nickname
  end
end

我认为这样的结果。

data = {
  id: 1,age: 18,name: {
    firstname: 'foo',lastname: 'bar',nickname: 'foobar',},}

当我使用实体的方法时,它返回这个。

EmpEntity.represent(data)
# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>nil,:lastname=>nil,:nickname=>nil}>

如何得到这样的结果。

# => #<EmpEntity:15940 id=1 age=18 name={:firstname=>'foo',:lastname=>'bar',:nickname=>'foobar'}>

并且点不要使用实体的 using 选项。 因为我的应用的结果不是合适的新实体。

解决方法

我认为 firstnamelastnamenil 因为您的实体不知道如何从散列中获取它们,您可以添加一个 lambda 来检查表示的实例是否是散列或不决定你如何返回值

class EmpEntity < Grape::Entity
  expose :id
  expose :age
  expose :name do
    expose :firstname,proc: lambda {|instance,options| 
      if instance.is_a? Hash
       instance[:name][:firstname]
      else
       instance.firstname
      end
    } 
    expose :lastname,options| 
      # same as above
    } 
    expose :nickname,options| 
      # same as aboce
    } 
  end
end

更新 普通版

class HashEntity < Grape::Entity
  class << self
    def hash_keys
      @hash_keys ||= []
    end

    def expose_hash(key)
      hash_keys << key
      if block_given?
        expose key do
          yield
        end
      else
        keys = hash_keys.dup
        expose key,proc: lambda { |instance,_|
         instance.dig(*keys)
        }
      end
      hash_keys.pop
    end
  end
end

演示

class InfoEntity < HashEntity
  expose :id
  expose_hash :name do
   expose_hash :first_name
   expose_hash :last_name
  end
end


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。