2016-01-06 4 views
1

У меня есть 4 модели, User, ImageSize, Frame и CartItem. Модель CartItem содержит все идентификаторы для 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 для текущего пользователя, чтобы я мог показать промежуточный итог для пользователя, который собирает сумму для всех картотеков

Не могли бы вы помочь с запросом или указать мне в правильном направлении, чтобы собрать эти данные?

Благодаря

Update

Что мне удалось собрать, но, конечно, Theres простой способ?

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

Смежные вопросы