Ruby on rails RubyonRails-选择具有匹配id的所有子关联 我有一个用户 一个用户有许多订单 一份订单有很多 订购商品 order\u项目与产品通过项目

Ruby on rails RubyonRails-选择具有匹配id的所有子关联 我有一个用户 一个用户有许多订单 一份订单有很多 订购商品 order\u项目与产品通过项目,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试选择所有的订单,这些订单包含订单项目,这些订单的产品与我的产品id匹配 这是一个现有的代码库,目前不可能进行大的重构 我曾这样处理这个问题: orders = current_user .orders .current .map { |order| order.order_items } .flatten .select { |order_item| order_item.item_id

我正在尝试选择所有的
订单
,这些订单包含
订单项目
,这些订单的
产品
与我的
产品id
匹配

这是一个现有的代码库,目前不可能进行大的重构

我曾这样处理这个问题:

orders = current_user
          .orders
          .current
          .map { |order| order.order_items }
          .flatten
          .select { |order_item| order_item.item_id.to_s == product_id }
          .map { |order_item| order_item.order }

它是有效的,我只是想知道是否有更好或更多的“Ruby方法”可以做到这一点?

使用单个查询而不是长的Ruby代码获取记录

current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")

使用单个查询而不是长ruby代码获取记录

current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")
避免在Ruby而不是Active Record中查询记录 目前编写的代码的主要问题是,大多数查询都是使用Ruby完成的,而不是让数据库通过ActiveRecord处理

一旦使用
map
方法,您就告诉活动记录从数据库返回记录并将其实例化到内存中

通过单独使用活动记录编写整个查询,您将获得更好的性能,避免多次查询,代码也将更简单

使用
连接
+
where
子句 查询的关键是使用
联接
链接所有关联,并
在何处
将它们筛选到所需的关联

从这个开始

current_user.orders.joins(:order_items)
从这里,您可以使用
where
子句根据所讨论的
产品id
进行筛选

current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })
where
子句能够将一个
散列作为参数,您可以使用该散列指定要在联接表(在本例中为
order\u items
表)上进行筛选


此处提供了相关文档:

避免在Ruby中查询记录,而不是在Active Record中查询记录 目前编写的代码的主要问题是,大多数查询都是使用Ruby完成的,而不是让数据库通过ActiveRecord处理

一旦使用
map
方法,您就告诉活动记录从数据库返回记录并将其实例化到内存中

通过单独使用活动记录编写整个查询,您将获得更好的性能,避免多次查询,代码也将更简单

使用
连接
+
where
子句 查询的关键是使用
联接
链接所有关联,并
在何处
将它们筛选到所需的关联

从这个开始

current_user.orders.joins(:order_items)
从这里,您可以使用
where
子句根据所讨论的
产品id
进行筛选

current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })
where
子句能够将一个
散列作为参数,您可以使用该散列指定要在联接表(在本例中为
order\u items
表)上进行筛选


此处提供了相关文档: