user
user
has_many
orders
。order
has_many
order_items
。order_items
与products
到items
的多态关联我正在尝试选择所有orders
和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方法”来做到这一点?
答案 0 :(得分:2)
当前编写的代码主要要担心的是,大多数查询是使用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
表)。
答案 1 :(得分:0)
通过单个查询而不是长红宝石代码获取记录
current_user.orders.left_outer_joins(order_items: :products).select("orders .* order_items.item_id = #{product_id}").group("orders.id")