我有4个模型,User
,ImageSize
,Frame
和CartItem
。 CartItem模型包含3个先前模型的所有id,所以
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
我的第一个问题是,这似乎不正确,就像在我的关联设置中一样,但是对于现在另一次的恶意地址。
Frame和ImageSize都有price
列,我想要实现的是获取当前用户的Frame和ImageSize的价格总和,以便Ii可以显示用户的小计收集所有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
答案 0 :(得分: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