Car*_*osa 4 ruby activerecord ruby-on-rails
类产品
has_many :sales
end
Class Sale
belongs_to :product
end
Run Code Online (Sandbox Code Playgroud)
我如何获得最畅销的产品..(产品找到所有..订购.. ventas ..)?
Jos*_*man 15
您可能希望通过在产品模型中使用计数器缓存列来一举两得(另一只鸟正在表演).例如,假设您为产品X进行销售.当该销售提交到数据库时,它将运行回调以增加该产品在数据库中产品行中的销售数量.当你销毁时,相反会减少产品数量.
您需要在products表中设置缓存列.在新迁移中,执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
您还需要对产品和销售模型进行一些更改,如下所示:
class Product < ActiveRecord::Base
has_many :sales
end
class Sale < ActiveRecord::Base
belongs_to :product, :counter_cache => true
end
Run Code Online (Sandbox Code Playgroud)
然后,您不必加载所有销售关联(在大型应用程序中,这将是危险的),您只需加载产品,并且您将拥有该行中的关联销售数量,绩效成本的一小部分.
希望这可以帮助!
如果您尝试按照与其相关的销售数量来订购产品,则实际上这可能是一个难题,具体取决于您的数据库.谷歌搜索来自transientink.com的答案,但这个解决方案对我个人不起作用.我怀疑这是因为与MySQL相比,PostgreSQL处理GROUP BY子句的方式不同.
另一个选项是在Sales中的产品关联上启用counter_cache(请参阅详细信息的链接)并按计数器缓存字段排序.
另一种选择是使用Ruby进行排序:
@top_products = Product.find(:all, :include => :sales).sort_by { |p| p.sales.size }
Run Code Online (Sandbox Code Playgroud)
这有两个主要问题,第一个是你利用你的网络服务器进行排序,这将减慢请求(可能明显,取决于产品的数量.)其次,你不能利用:finder中的限制选项,因此如果您只想要销售前十大产品,则必须从数据库中获取所有产品,在应用程序中对它们进行排序,然后再限制它们.
| 归档时间: |
|
| 查看次数: |
6656 次 |
| 最近记录: |