1

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

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

  1. 将 ActiveRecord 对象传递给两个类(我当前的实现)
  2. 传递对象的数据库表 id 并从每个类中获取。

这些选项中的哪一个对它的“气味”较少。我的大脑告诉我,一旦 id 到达另一个类,通过执行另一个数据库查询来传递 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
4

1 回答 1

0

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

在我看来,使用 id 列表在处理时间、内存使用、数据库使用等各个方面的效率都较低。

于 2012-10-02T16:04:20.220 回答