0

J'utilise un rakefile pour aller chercher des informations d'un site Web et l'enregistrer dans ma base de données.Ruby on Rails - Rakefile validates_uniqueness_of

Utilisation du films TMDB-Gem, ce code @movie = TmdbMovie.browse(:order_by => "release", :order => "asc", :page => 1, :per_page => 2, :language => "en", :expand_results => true) les plus anciens (navigue :order_by => "release") et les enregistre dans ma base de données, mais comme je vais courir ce râteau assez souvent, les films sont retournés et sauvés seront les mêmes.

Chaque film a une tmdb_id et chaque id est unique

Comment puis-je faire la vérification de rakefile que la tmdb_id de film retourné est unique, et s'il y a déjà un film avec cet identifiant, sauter et enregistrer le prochain film .

Je l'ai essayé dans mes films modèle validates_uniqueness_of :tmdb_id mais il donne une erreur lors de l'exécution de la commande rake et il ne sauve pas les films.

En gros, comment puis-je, à travers le rakefile, valider l'unicité de la tmdb_id

Ceci est mon fichier râteau

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 

Répondre

1

Vous avez raison d'utiliser validates_uniqueness_of :tmdb_id dans votre modèle Movie. Vous n'avez pas montré comment vous sauvegardiez les films dans votre base de données, mais .save ne provoque pas d'exception lorsque les validations échouent, alors que .save! le fait. La clé consisterait à utiliser une méthode de sauvegarde qui ne génère pas d'erreur lorsque les validations échouent.

Edit - Maintenant que je comprends ce que vous êtes en train d'essayer de le faire, vous devriez être en mesure de faire quelque chose comme:

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") 

Donc, si vous avez déjà tiré 435 films, cela ne fera que le retour films 400-500 dans le prochain appel .. je l'ai fait de cette façon parce que je ne sais pas s'il y avait une option offset, mais s'il est juste que vous pourriez compenser la requête par Movie.count, ce qui serait mieux.

+0

Ajout mon fichier de coupe à la question. En utilisant 'validates_uniqueness_of: tmdb_id' provoque la commande de coupe pour ne pas enregistrer les films retournés, alors que si je retire' validates_uniqueness_of: tmdb_id' il sauve – PMP

+0

'create' ne devrait pas soulever une exception, pouvez-vous s'il vous plaît nous montrer l'erreur que vous obtenez? –

+0

Il ne retourne pas une erreur. Qu'est-ce qui se passe est que, si je n'ai pas les validates ... dans le modèle, puis pousser à heroku et exécuter la commande rake, il enregistre les films retournés à ma base de données, comme il se doit. Mais, si j'ajouter validates_uni ... à mon modèle, puis pousser à Heroku et exécutez la commande de coupe, il ne marche pas enregistrer les films retournés dans ma base de données – PMP