使用模型定义的方法在Controller中定义产品

时间:2018-03-16 04:19:14

标签: ruby-on-rails postgresql

您好我试图在控制器中调用特定产品:

products_controller.rb:

def index
    @products = Product.where(:active => true)
end

使用product_decorator.rb:

更新索引方法
def purchase(from_date, to_date)
   LineItem.select('product_id, SUM(quantity) AS quantity_sold')
   .where({orders: {state: 'complete', completed_at: from_date..to_date}})
   .group(:product_id).inject({}) {|h, l| h[l.product_id] = l.quantity_sold; h}
end

(这会返回每种产品的购买数量)

这样新的products_controller.rb索引将显示为:

def index
    @products = Product.where(:active => true).where.purchase(Date.today-365,Date.today).count > 1
end

仅显示已购买的'产品。 ' .where.purchase(日期...'是我完全迷失的地方,因为我不知道如何使用辅助方法在控制器中进行查询。

非常感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

您需要将purchase方法定义为类方法或范围,即以下之一:

<强> product.rb

def self.purchase(from_date, to_date)
   LineItem.select('product_id, SUM(quantity) AS quantity_sold')
           .where({orders: {state: 'complete', completed_at: from_date..to_date}})
           .group(:product_id).inject({}) {|h, l| h[l.product_id] = l.quantity_sold; h}
end

或者:

scope :purchase, (from_date, to_date) ->  { 
  LineItem.select('product_id, SUM(quantity) AS quantity_sold')
          .where({orders: {state: 'complete', completed_at: from_date..to_date}})
          .group(:product_id).inject({}) {|h, l| h[l.product_id] = l.quantity_sold; h}
}

然后你就可以使用以下方法在一组记录上调用它:

@products = Product.where(:active => true).purchase(Date.today-365,Date.today).count > 1

这涵盖了您在问题中遇到的问题。这有帮助吗?

我没有看过方法中的实际代码(并考虑将命名调整为更清晰的东西),但这应该会让你朝着正确的方向前进。

如果您遇到后续问题,请弹出一个新问题并随时给我一个喊叫声:)