我的rails程序中有4个数据库,产品,产品,产品和订单
样品供应:中型套件
Medium Kit包含2个产品(这是在OfferingProduct数据库中设置的) 1小 2中等
客户订单2中型套件
此程序应该从此订单中占2个小型和4个中型,并且许多订单类似
我正在尝试建立一个库存系统,以跟踪每周销售的每种产品的数量,以便我可以重新订购产品。为了计算这个,我有:
def get_trend
product = Product.first
customer_orders =[]
product.offerings.each do |o|
customer_orders = customer_orders + o.orders
end
o=customer_orders.group_by { |t| t.date.beginning_of_week }
y = []
op=self.offering_products;
o.sort.each do |week, orders|
y << orders.map { |o| o.quantity*op.find_by_offering_id(o.offering).quantity }.sum
end
return y
end
这似乎有效,但计算大约需要20秒。有没有办法让这更快?
我知道大部分时间都是在。y << orders.map { |o| o.quantity*op.find_by_offering_id(o.offering).quantity }.sum
行计算给定周内订购的产品数量。有什么想法吗?
答案 0 :(得分:1)
问题是当你最好使用声明(即数据库中的连接)时,你正在使用迭代(即应用程序代码中的循环)。循环永远不会像连接一样快,将数据集移动到应用程序的内存中也不会有任何帮助。
我猜你在使用ActiveRecord?如果是这样,这可能有助于如何使用联接进行查询:http://guides.rubyonrails.org/active_record_querying.html
答案 1 :(得分:1)
感谢来自Iain的信息,这是我最终做的事情
def get_trend
sql = ActiveRecord::Base.connection()
if Rails.env == "production"
d=sql.execute("SELECT SUM(orders.quantity * offering_products.quantity), EXTRACT(ISOYEAR FROM orders.date) AS year, EXTRACT(WEEK FROM orders.date) AS week " +
" FROM orders " +
" INNER JOIN offerings ON offerings.id = orders.offering_id " +
" INNER JOIN offering_products ON offering_products.offering_id = offerings.id " +
" INNER JOIN products ON products.id = offering_products.product_id " +
" WHERE (products.id = #{self.id}) GROUP BY year, week ORDER BY year, week ")
y=d.map { |a| a["sum"].to_i }
else
d=sql.execute("SELECT SUM(orders.quantity * offering_products.quantity), strftime('%G-%V', orders.date) AS year " +
" FROM orders " +
" INNER JOIN offerings ON offerings.id = orders.offering_id " +
" INNER JOIN offering_products ON offering_products.offering_id = offerings.id " +
" INNER JOIN products ON products.id = offering_products.product_id " +
" WHERE (products.id = #{self.id}) GROUP BY year")
y=d.map { |a| a[0] }
end
return y
end
更新:需要区分生产和本地之间的代码,因为heroku使用postgresql,并且日期函数的工作方式不同:(这也意味着结果不完全相同,因为函数以不同的方式处理一年中的第一周。