user
user
has_many
orders
.order
has_many
order_items
.order_items
通过products
与items
具有多态关联我正在尝试选择所有具有与我的orders
相匹配的product
的order_items
的product
的product_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方式“来做到这一点?
发布于 2018-09-12 05:08:53
避免查询Ruby中的记录而不是活动记录
当前编写的代码的主要关注点是,大多数查询都是使用Ruby完成的,而不是让数据库通过活动记录来处理。
一旦您使用了map
方法,您就告诉Active Record从数据库返回记录并实例化它们到内存中。
通过单独使用Active Record编写整个查询,您将获得更好的性能,避免多个查询,代码也会更简单。
使用joins
+ where
子句
查询的关键是使用joins
将所有关联链接起来,并使用where
将它们过滤到所需的关联。
从这个开始
current_user.orders.joins(:order_items)
从这里开始,您可以使用一个where
子句来对问题中的product_id
进行筛选。
current_user.orders.joins(:order_items).where(order_items: { item_id: product_id })
where
子句可以将Hash
作为参数,您可以使用该哈希指定要在联接表(在本例中为order_items
表)上筛选。
这方面的文件如下:
发布于 2018-09-12 02:08:33
用单个查询而不是长的ruby代码获取记录
current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")
https://stackoverflow.com/questions/52286063
复制相似问题