首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更快地运行此代码

如何更快地运行此代码
EN

Code Review用户
提问于 2016-12-07 09:05:28
回答 1查看 79关注 0票数 -1

这个示例代码是正确的,没有错误,但是这很好,只有当你只有几百或上千个数据,但是如果你有一百万次查询,这需要时间来改进这个算法。

代码语言:javascript
运行
复制
  namespace :auto_status do
    desc "Add Status to the Tracking code Automaticaly"
    task make_status: :environment do
    @product_trackers = ProductTracker.all
    @statuses = Status.all
    @date = DateTime.now.utc
    @product_trackers.each do |product_tracker|

            if (Status.where(product_tracker_id: product_tracker.id).count == 1 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 1)
                @links = Status.new
                @links.order_status = 1
                @links.product_tracker_id = product_tracker.id

                @links.save
            elsif (Status.where(product_tracker_id: product_tracker.id).count == 2 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 2)

                @links = Status.new
                @links.order_status = 2
                @links.product_tracker_id = product_tracker.id

                @links.save
            elsif (Status.where(product_tracker_id: product_tracker.id).count == 3 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 5)

                @links = Status.new
                @links.order_status = 3
                @links.product_tracker_id = product_tracker.id

                @links.save
            elsif (Status.where(product_tracker_id: product_tracker.id).count == 4 && (((Time.parse(DateTime.now.to_s) - Time.parse(Status.where(product_tracker_id: product_tracker.id).first.created_at.to_s))/1.days).round) == 6)
                @links = Status.new
                @links.order_status = 4
                @links.product_tracker_id = product_tracker.id

                @links.save
            end
    end

  end

end
EN

回答 1

Code Review用户

发布于 2016-12-07 12:03:47

您有大量的代码重复,其中一个重要的规则是“不重复”(不要重复自己),请检查以下内容,我所做的只是干燥代码:

代码语言:javascript
运行
复制
namespace :auto_status do
  desc "Add Status to the Tracking code Automaticaly"
    task make_status: :environment do

    ProductTracker.select(:id).find_each do |product_tracker|
      status = Status.where(product_tracker_id: product_tracker.id)
      count = status.count
      next if count == 0
      days_diff = ((Time.parse(DateTime.now.to_s) - Time.parse(status.first.created_at.to_s))/1.days).round

      if ( (count == 1 && days_diff == 1) || 
           (count == 2 && days_diff == 2) || 
           (count == 3 && days_diff == 5) ||
           (count == 4 && days_diff == 6) ){
            Status.create(product_tracker_id: product_tracker.id, order_status: count)
           }
    end
  end
end  

请注意这里

  • 使用find_each时,如果您有许多会破坏内存的ProductTracker,则find_each将将它们批量加载。
  • ProductTracker中选择惟一需要的id。
  • 如果没有状态,则跳过循环,这样可以节省时间,在不需要的情况下执行下一个条件。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/149183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档