Ruby on rails 在{}内使用带映射的select追加空白数组

Ruby on rails 在{}内使用带映射的select追加空白数组,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想在一个循环中使用select,以附加来自另一个map循环的匹配结果 下面的select代码提供了一个空白数组: vendor_products = VendorProduct.where(vendor_id: vendor_order.vendor_id) vendor_order.order.line_items.select do |li| li.shop_product.product == vendor_products.map {|vp| vp.product } end 即

我想在一个循环中使用
select
,以附加来自另一个
map
循环的匹配结果

下面的select代码提供了一个空白数组:

vendor_products = VendorProduct.where(vendor_id: vendor_order.vendor_id)
vendor_order.order.line_items.select do |li|
  li.shop_product.product == vendor_products.map {|vp| vp.product }
end
即使在控制台中,
[]

当我这样做时:

vendor_order.order.line_items.select { |li| li.shop_product.product }
它本身会附加结果。(使用
每个
地图
等)

当我这样做时:

vendor_products.map {|vp| vp.product }
它本身也会附加结果

做:

vendor_order.order.line_items.select { |li| li.shop_product.product_id == 1 }}
同样有效,并显示结果

我试过在
product
上使用
product\u id
,但结果仍然是空白。尽管如此,我还是需要整个
产品


当两个循环都独立运行时,结果会匹配,
产品
匹配,因此select应该会出现匹配结果,但不知何故却不会。在
{}
中使用map是否不适用


我的代码有问题吗?我怎样才能得到结果

我的目标是这样做:

def foo
    vendor_products = VendorProduct.where(vendor_id: self.vendor_id)
    product = self.order.line_items.select { |li| li.shop_product.product == vendor_products.map {|vp| vp.product }}
    return "#{product.title, product.color}"
end

并将其用于CSV输出。

您可以尝试以活动记录方式使用SQL:

product = VendorProduct.where(vendor_id: vendor_id,
                              product_id: order.line_items.shop_product.id)
"#{product.title, product.color}"

li.shop\u product.product
是单一产品吗?然后,
i.shop\u product.product==vendor\u products.map{| vp | vp.product}
将永远不会为真,因为
.map
正在返回一个产品数组。因此,您的
选择将不会选择任何内容。可能您误解了
.select
的工作原理,即返回使块返回truthy的所有元素。我假设select返回匹配的结果,这些结果是真的<代码>[1,2,3]。选择{s|s==4}
将返回
[4]
…或者我在这里看到了错误。例如,它将返回一个空数组,因为对象中没有元素等于“4”,但是,select将返回块中条件计算为true的所有元素,因此,它可以是0、1或更多。在您的例子中,您应该使用
find
,它应用与select相同的逻辑,但只返回后面的第一个元素oops我指的是3而不是4….
。select
返回块返回true的项目列表,正如我在第一条注释中提到的。您的块表达式始终为false。查看
的在线文档。选择
。是的,你可能是一个beastMaybe。你可以检查你的关系,这样你就可以从供应商那里获得正确的产品。更简单的方法,因为这里需要从一长串方法中获取产品id。