Ruby on Rails-选择所有具有匹配ID的子关联

时间:2018-09-12 01:05:08

标签: ruby-on-rails ruby activerecord

  • 我有一个user
  • 一个user has_many orders
  • 一个order has_many order_items
  • order_itemsproductsitems的多态关联

我正在尝试选择所有ordersorder_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方法”来做到这一点?

2 个答案:

答案 0 :(得分:2)

避免查询Ruby中的记录而不是Active Record

当前编写的代码主要要担心的是,大多数查询是使用Ruby完成的,而不是让数据库通过Active Record处理。

使用var pngBytes = await image.toByteData(format: ui.ImageByteFormat.png); // requesting external storage permission if(!(await checkPermission())) await requestPermission(); // Use plugin [path_provider] to export image to storage Directory directory = await getExternalStorageDirectory(); String path = directory.path; print(path); // create directory on external storage await Directory('$path/$directoryName').create(recursive: true); // write to storage as a filename.png File('$path/$directoryName/filename.png') .writeAsBytesSync(pngBytes.buffer.asInt8List()); 方法后,您就告诉Active Record从数据库返回记录并将它们实例化到内存中。

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

使用map + 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表)。


有关此文档,请参见:
https://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

答案 1 :(得分:0)

通过单个查询而不是长红宝石代码获取记录

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