Rails 3正确的地方创建一个实用工具方法

时间:2013-12-23 13:10:36

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

我正在创建一个应用程序,我会有一些预定的(cron)方法(我猜它会被rake调用)来获取和解析一些远程数据(主要是HTML),然后将它存储在我的模型中。

我在我的模型中创建了一个方法来获取远程数据,并在同一模型中创建了另一个方法来解析和保存这些数据。我觉得这是错的,这是我的问题:

我的fetch和解析方法应该在哪里?我应该创建一个模块吗?我应该创建一个Lib吗?

我认为应该采用“轨道方式”来做到这一点,但我还没想出来。你能给我一些提示吗?

3 个答案:

答案 0 :(得分:2)

我的建议是只在模型中保留与模型的持久性范围严格关联的方法。

您的新代码与严格持久性相关。它可以被视为数据导入者。您可以轻松地为此创建新的类/模块。

例如,假设您的库将下载一些HTML,解析它并将内容保存为Model实例。

此文件应位于/lib,例如/lib/crawler.rb

class Crawler
  def run(url)
    # ...
    fetch( ... )
    parse( ... )
    import( ... )
  end

  def fetch(...)
    # ...
  end

  def parse(...)
    # ...
  end

  def import(...)
    # ...
    result.each do |result|
      Model.create( ... )
    end
  end
end

这可确保您的Model课程不会很快充满属于多种不同功能的方法。

此外,您将能够独立于Model

测试此库

在你的rake任务或工作者中,只需创建一个新的爬虫实例(再次,这只是一个例子)并运行它。

tast :crawler => [:environment] do
  craweler = Crawler.new
  craweler.run( ... )
end

答案 1 :(得分:1)

你可能想在cron / scheduling / polling上观看Ryan Bates的轨道广播

http://railscasts.com/episodes/164-cron-in-ruby-revised http://railscasts.com/episodes/271-resque

非常好的指南。

答案 2 :(得分:0)

您可以做几件事,具体取决于您的新型号将使用多少型号。

您可以将它们添加到模型“帮助程序”中,也可以创建一个新模块并将其放在lib目录中。然后,您可以在模型中包含lib / module。尼斯;干净的代码。

enter image description here