首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails选择具有匹配id的所有子关联

Rails选择具有匹配id的所有子关联
EN

Stack Overflow用户
提问于 2018-09-12 01:05:07
回答 2查看 2.8K关注 0票数 1
  • 我有一个user
  • user has_many orders.
  • order has_many order_items.
  • order_items通过productsitems具有多态关联

我正在尝试选择所有具有与我的orders相匹配的productorder_itemsproductproduct_id

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

我是这样处理问题的:

代码语言:javascript
运行
复制
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方式“来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-12 05:08:53

避免查询Ruby中的记录而不是活动记录

当前编写的代码的主要关注点是,大多数查询都是使用Ruby完成的,而不是让数据库通过活动记录来处理。

一旦您使用了map方法,您就告诉Active Record从数据库返回记录并实例化它们到内存中。

通过单独使用Active Record编写整个查询,您将获得更好的性能,避免多个查询,代码也会更简单。

使用joins + where子句

查询的关键是使用joins将所有关联链接起来,并使用where将它们过滤到所需的关联。

从这个开始

代码语言:javascript
运行
复制
current_user.orders.joins(:order_items)

从这里开始,您可以使用一个where子句来对问题中的product_id进行筛选。

代码语言:javascript
运行
复制
current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })

where子句可以将Hash作为参数,您可以使用该哈希指定要在联接表(在本例中为order_items表)上筛选。

这方面的文件如下:

querying.html#specifying-conditions-on-the-joined-tables

票数 3
EN

Stack Overflow用户

发布于 2018-09-12 02:08:33

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

代码语言:javascript
运行
复制
current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52286063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档