1

Je travaille sur une application de film social dans Rails. Je ne souhaite pas partir de zéro sur une base de données d'infos sur les films, j'ai donc trouvé une base de données de films gratuite et soutenue par la communauté appelée The Movie Database (TMDB). Il a une bonne API et de la documentation.Comment créer un modèle Rails 4 hybride entre des enregistrements locaux et des ressources distantes?

Comment créer un modèle Rails pouvant être entièrement associé à mon modèle utilisateur et pouvant utiliser un enregistrement local de ma table de films, mais si cet enregistrement n'existe pas, effectuez un appel API pour obtenir l'info? J'ai fait un peu de recherche et il semble qu'ActiveResource fasse partie de ce que je veux, mais il n'offre pas vraiment d'associations avec ActiveRecord.

Répondre

1

Je pense que cela dépend de comment vous interrogez votre base de données locale pour voir si un film est là et, sinon, interroger l'API. Idéalement, vous devez utiliser les mêmes ids du api localement (peut-être sur un terrain imdb_id?) Et des films de la requête à partir de là:

m = Movie.from_imdb_id(832903820) 

où:

def self.from_imdb_id(imdb_id) 
    m = Movie.where(imdb_id: imdb_id).first 
    if m.blank? 
    # I dont know how the api queries work so suggesting something here: 
    data = RestClient.get("http://api.tmdb.com/movies/#{imdb_id}.json") 
    m = Movie.create!(data.merge(imdb_id: imbd_id) 
    end 
    return m 
end 
+0

C'est à peu près ce que j'ai imaginé. J'étais surtout curieux s'il y avait d'autres façons dont je devrais considérer, d'autant plus que je ne suis pas trop familier avec ActiveResource, qui semble faire à peu près ce que je veux, sauf rapport avec les modèles ActiveRecord. –

0

Que diriez-vous ceci:

Movie.find_or_create_by(imdb_id: imdb_id) do |movie| 
    data = RestClient.get("http://api.tmdb.com/movies/#{imdb_id}.json") 
    movie.director = data['director'] 
    ..... 
end 

Il trouverait un enregistrement correspondant à imdb_id, sinon, créerait un nouveau avec les paramètres dans le bloc.

Cordialement!