2013-07-28 42 views
0

我使用Rake文件從一個網站獲取信息,並保存到我的數據庫。Ruby on Rails的 - Rake文件validates_uniqueness_of

使用TMDB寶石,這個代碼@movie = TmdbMovie.browse(:order_by => "release", :order => "asc", :page => 1, :per_page => 2, :language => "en", :expand_results => true)瀏覽歷史最悠久的電影(:order_by => "release"),並將其保存到我的數據庫,但我會相當頻繁地運行此耙,返回和保存的電影將是相同的。

每部影片都有一個tmdb_idid是唯一

我怎樣才能讓Rake文件檢查,返回影片的tmdb_id是唯一的,如果已經有一個電影與ID,跳過,節省下一部電影。

我想在我的電影模式validates_uniqueness_of :tmdb_id但在運行rake命令時,它給出了一個錯誤,它不保存電影。

基本上,我怎樣才能通過Rake文件,驗證了tmdb_id

的獨特性這是我耙文件

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

你有權在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,這將是更好的抵消查詢。

+0

加我耙文件的問題。使用'validates_uniqueness_of:tmdb_id'導致rake命令不保存返回的電影,而如果我刪除'validates_uniqueness_of:tmdb_id'它保存它 – PMP

+0

'create'不應引發異常,可以請你告訴我們你的錯誤? –

+0

它不會返回錯誤。會發生什麼呢,如果我沒有驗證...在模型中,然後推送到heroku並運行rake命令,它會將返回的電影保存到我的數據庫中,就像它應該這樣做。但是,如果我添加validates_uni ......我的模型,然後推到的Heroku和運行rake命令,它不返回的電影保存到我的數據庫 – PMP