我正在创建一个应用程序,我会有一些预定的(cron)方法(我猜它会被rake调用)来获取和解析一些远程数据(主要是HTML),然后将它存储在我的模型中。
我在我的模型中创建了一个方法来获取远程数据,并在同一模型中创建了另一个方法来解析和保存这些数据。我觉得这是错的,这是我的问题:
我的fetch和解析方法应该在哪里?我应该创建一个模块吗?我应该创建一个Lib吗?
我认为应该采用“轨道方式”来做到这一点,但我还没想出来。你能给我一些提示吗?
答案 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。尼斯;干净的代码。