Ruby on Rails - Rakefile validates_uniqueness_of

时间:2013-07-28 14:04:41

标签: ruby-on-rails model rake rakefile validates-uniqueness-of

我正在使用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

1 个答案:

答案 0 :(得分:1)

您在validates_uniqueness_of :tmdb_id模型中使用Movie是正确的。您没有显示如何将电影保存到数据库,但.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来反对查询,这会更好。