2016-01-06 53 views
1

我有4個型號,User,ImageSize,FrameCartItem。該CartItem模型保存所有的id爲3組以前的型號,所以獲取關聯列的總數

class CartItem < ActiveRecord::Base 
    belongs_to :image_size 
    belongs_to :user 
    belongs_to :frame 
end 

create_table "cart_items", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "image_size_id" 
    t.integer "frame_id" 
end 

class User < ActiveRecord::Base 
    has_many :cart_items 
end 

我第一次在這裏的問題是這似乎不正確的,因爲在我的關聯安裝,但現在生病地址其他時間。

一個幀和ImageSize都有一個price列,我想要實現的是獲得當前用戶的Frame和ImageSize的價格總和,以便我可以顯示收集總和的用戶的小計爲所有cartitems

任何人都可以幫助查詢或指向我在正確的方向收集這些數據嗎?

感謝

更新

我設法拼湊,但肯定那裏有更簡單的方法?

def show 
    @frame_total = CartItem.frame_price_total(current_or_guest_user) 
    @image_size_total = CartItem.image_size_price_total(current_or_guest_user) 
    @subtotal = CartItem.subtotal(@frame_total, @image_size_total) 
end 

class CartItem < ActiveRecord::Base 
    def self.frame_price_total(u) 
    @price_array = [] 
    user = includes(:frame).where(user_id: u) 
    user.each do |f| 
     @price_array << f.frame.price 
    end 
    @price_array.sum 
    end 

def self.image_size_price_total(u) 
    @price_array = [] 
    user = includes(:image_size).where(user_id: u) 
    user.each do |f| 
    @price_array << f.image_size.price 
    end 
    @price_array.sum 
end 

def self.subtotal(image_size_total, frame_size_total) 
    total = image_size_total + frame_size_total 
    BigDecimal.new(total).to_s 
end 
end 

回答

1

它看起來不錯,但有N+1 query問題

def show 
    @user_frames = CartItem.includes(:frame).where(user_id: current_user) 
    frame_array = [] 
    @user_frames.each do |f| 
     frame_array << f.frame.price 
    end 
    @frame_total = frame_array.sum 
    end 
+0

謝謝你的提示 – Richlewis