如何在Rails中重构此数据库查询

时间:2014-03-06 17:11:59

标签: ruby-on-rails spree

免责声明:我是Rails的新手。

我正在尝试做的是长篇形式:

user = Spree::User.find(2)
cart = Spree::Order.where(state: "cart", user_id: user.id)
line_item = Spree::LineItem.where(order_id: cart.last.id).map { |order| order.variant_id}
variant = Spree::Variant.find(line_item).map { |order| order.product_id }
Spree::Product.find(variant).map { |product| product.name }

它会进入数据库,找到用户,获取状态在购物车中的订单。然后去找到它的订单项。过去查找“变体”数据以找出包含哪些产品。然后到产品页面告诉我用户购物车中的所有产品。

这看起来很丑陋而且gar gar gar。你不会碰巧知道重构它的方法而不是那么多查询吗?

1 个答案:

答案 0 :(得分:1)

如果你看Spree Order States,那不是你在不同的州有多个订单,只是一个订单可能处于一个特定的状态。

这实际上取决于Spree::User。我找不到Spree::User的文档和/或来源,但提及某个LegacyUser。 因为在您提到的评论中,您有自定义构建,您需要检查Spree::User的实际代码,看看用户是否可以拥有一个或多个订单,以及是否已有选择购物车状态订单的方法。 / p>

所以如果Spree::User有一个订单:

order = user.order
order.variants.map(&:name)

否则:

order = user.orders.where(state: "cart")
order.variants.map(&:name)

可能有一种方法可以从代码中获取用户所需的订单。