获取关联列的总数

时间:2016-01-06 13:55:51

标签: ruby ruby-on-rails-4

我有4个模型,UserImageSizeFrameCartItem。 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

1 个答案:

答案 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