将ActiveRecord对象与数据库表ID传递给方法之间的更好做法

时间:2012-10-02 14:44:10

标签: ruby-on-rails ruby ruby-on-rails-3 oop

我有一个rake任务,从数据库(事件模型)中获取事件的数据   状态为“打开”并通过调用两种不同的方法来处理这些事件   类。第一个根据某些条件对事件进行批处理,另一个是a   为这些事件批生成CSV并将CSV上载到外部的爬网程序   网站此后更新引用这些批次后的每个事件的状态   抓取完成执行。

将Active Record对象传递给这两个类的方法有两种方法。

  1. 将ActiveRecord对象传递给两个类(我当前的实现)
  2. 传递对象的数据库表ids,只需从中获取每个数据库 那些课程。
  3. 其中哪些选项对'气味'的影响较小。我的大脑告诉我通过ids   一旦id到达,就会通过执行另一个数据库查询来降低性能   另一堂课。另一方面,传递带有所有数据的ActiveRecord对象   因为所有将要更新的状态是超级的。那么哪个选项更好?我已经包括了rake任务,只是为了清楚地了解我的意思。

      desc "Process open Events ..."
      task :process_open_events => :environment do
        open_events = Event.find_all_by_status("Open")
        event_batches = EventUtils::EventProcessor.create_event_batches(open_events)
        crawler = EventsCrawler.create!
        crawler.enqueue_crawler(event_batches)
      end
    

1 个答案:

答案 0 :(得分:0)

在这种情况下,您将读取(并保留在内存中)记录列表,然后将其ID映射到数组(也保存在内存中),将该数组发送到另一个方法而不只是重新运行您的查询知道将有相同的结果,但也将该初始列表的副本放入内存中。

在我看来,使用id列表在各方面都不太有效,处理时间,内存使用情况,数据库使用情况。