2014-03-06 29 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