2014-03-06 26 views
1

声明:我是Rails的新手。如何在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 } 

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

这看起来很难看,也很garjumbled。你不会碰巧知道一种重构它的方式,而不是那么多的查询?

+0

关键字“有很多”随处可见。我想我会注意到这一点...我应该提到Spree是一款开源的电子商务框架,适用于Ruby on Rails。 – BenMorganIO

+0

您正在使用哪种版本的Spree?我找不到Spree :: User的任何文档和/或代码... – raviolicode

+0

可能是因为我现在正在使用自定义构建。 – BenMorganIO

回答

1

如果你看看Spree Order States,这并不是说你在不同的状态下有多个订单,只是一个订单可能在一个特定的状态。

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

所以,如果Spree::User有一个顺序:

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

否则:

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

有可能是让你从代码的用户需要的顺序的方法。

+0

有关“变体”是什么的清晰说明。基本上你有一个产品。一件产品也许是一件t恤。一个变体属于该产品,并会列出该T恤的不同“变体”:红色T恤,绿色T恤,蓝色T恤,你会明白。希望有所帮助。 – BenMorganIO

+0

我正在通过它进行更改。从上到下。在我们的模型中,我们没有指定用户有很多订单。也没有什么你在这里。我会添加它们。 – BenMorganIO

+0

我需要一个属于用户的顺序吗? – BenMorganIO