我认为你应该退后一步,记住一个实体应该代表一个对象,因为它看起来并不像你在这里所做的那样。所以你应该有一个实体来代表你的代码库的 Order 对象概念(AsSeller 听起来像是一种可见性限制,而不是一个对象),并with_options用来限制什么是公开的或不公开的。
module Entities
class Order < Grape::Entity
expose :name
with_options(if: { visibility: :seller }) do
expose :note
end
end
end
order = { name: 'Relax', note: "Don't do it" }
# Standard order representation
Entities::Order.represent(order).serializable_hash
=> {:name=>"Relax"}
# Order represented with visibility: :seller
Entities::Order.represent(order, visibility: :seller).serializable_hash
=> {:name=>"Relax", :note=>"Don't do it"}
或者,如果只是有条件地公开仅存在于订单模型的某些后代上的属性,您应该能够执行以下操作:
expose :note, if: ->(order, _) { order.respond_to?(:note) }
如果您确实需要包含在其他地方定义的属性子集,您可以编写一个关注并将其包含在另一个实体中,但从我在您的问题中可用的上下文和您使用的命名来看,似乎不是这样这里是一个很好的解决方案。