Order products by association count

后端 未结 3 1608
再見小時候
再見小時候 2020-12-09 07:10

Class Product

has_many :sales

end

Class Sale

belongs_to :product

end

How do i get the most sold products.. (Product find all.. order by

3条回答
  •  执笔经年
    2020-12-09 07:26

    You might want to hit two birds with one stone (the other bird being performance) by using a counter cache column in the product model. For instance, say you make a sale for product X. When that sale is committed to the database, it will run a callback to increase the number of sales for that product in the product's row in the database. When you destroy, it conversely decreases the number of products.

    You'd need to set up a cache column in the products table. In a new migration, do this:

    add_column :products, :sales_count, :integer, default => 0
    
    Product.reset_column_information
    
    Product.all.each do |product|
      Product.update_counters(product.id, :sales_count => product.sales.length
    end
    

    You'd also need to make some changes to your Product and Sale models, like this:

    class Product < ActiveRecord::Base
      has_many :sales
    end
    
    class Sale < ActiveRecord::Base
      belongs_to :product, :counter_cache => true
    end
    

    Then, instead of having to load all of the sales associations (which, in a large app, would be treacherous), you'd just load the product, and you'd have the number of associated sales in the row itself, for a fraction of the cost of performance.

    Hope this helps!

提交回复
热议问题