我正在使用一个rakefile从一个网站获取信息,并将其保存到我的数据库中。
使用TMDB-Gem,这个代码@movie = TmdbMovie.browse(:order_by => "release", :order => "asc", :page => 1, :per_page => 2, :language => "en", :expand_results => true)
浏览最旧的电影(:order_by => "release"
)并将它们保存到我的数据库中,但由于我将非常频繁地运行这个rake,所以返回和保存的电影将是相同的。
每个电影都有一个tmdb_id
,每个id
都是唯一的
我如何让rakefile检查返回的电影的tmdb_id是否唯一,如果已经有一部电影具有该id,则跳过并保存下一部电影。
我在我的电影模型validates_uniqueness_of :tmdb_id
中尝试过它,但它在运行rake命令时出错,并且无法保存电影。
基本上,我如何通过rakefile验证tmdb_id 的唯一性
这是我的rake文件
namespace :db do
task :pull_tmdb_data => :environment do
Tmdb.api_key = "API KEY"
Tmdb.default_language = "en"
@movie = TmdbMovie.browse(:order_by => "release", :order => "asc", :page => 1, :per_page => 2, :language => "en", :expand_results => true)
@movie.each do |movie|
Movie.create(title: movie.name, description: movie.overview, release_date: movie.released, tmdb_id: movie.id)
end
end
end
在Movie
模型中使用validates_uniqueness_of :tmdb_id
是正确的。您没有显示如何将电影保存到数据库中,但当验证失败时,.save
不会引起异常,而.save!
会引起异常。关键是使用一种保存方法,该方法在验证失败时不会引发错误。
编辑-现在我明白了你实际上想做什么,你应该能够做一些事情,比如:
per_page = 100
number_of_movies = Movie.count
page = number_of_movies/per_page+1
@movies = TmdbMovie.browse(:order_by => "release", :order => "asc", :page => page, :per_page => per_page, :language => "en", :expand_results => true) browses the oldest movies (:order_by => "release")
因此,如果你已经撤下435部电影,它在下一个电话中只会返回400-500部电影。。我这样做是因为我不确定是否有offset
选项,但如果有,你可以将查询偏移Movie.count
,这会更好。