2017-09-17 7 views
1

J'essaie de renvoyer des données au format json depuis mon API Sinatra REST. J'ai actuellement un tas d'associations mises en place, mais j'ai de la difficulté à obtenir les vues que je veux de mon API malgré le fait de les avoir facilement dans Ruby.Obtention d'associations Sequel via Sinatra

Par exemple, de mes tableaux:

DB.create_table?(:calendars) do 
    primary_key :id 

end 

DB.create_table?(:schedules) do 
    primary_key :id 

    foreign_key :resource_id, :resources 
    foreign_key :task_id, :tasks 
    foreign_key :calendar_id, :calendars 
end 

En Ruby, je suis en mesure d'exécuter un bloc comme celui-ci et afficher toutes les informations dont j'ai besoin dans mes associations:

Calendar.each do |c| 
    c.schedules.each do |s| 
    puts "RESOURCE ##{s.resource_id}" 
    s.tasks.each do |t| 
     p t 
    end 
    puts 
    end 
end 

la L'appel fonctionne parce que mon modèle calendar contient une association one_to_many :schedules. Maintenant, je me demande comment cela se traduit par mon API Sinatra. Dans mon simple, la route GET, j'ai essayé de nombreuses variantes en essayant d'obtenir les horaires associés à un calendrier, et le convertir en JSON:

get '/calendars' do 
    c = DB[:calendar].first 
    c.schedules.to_json 
    content_type :json 
end 

... mais je vais finir avec une erreur comme undefined method 'schedules' for {:id=>1}:Hash

On dirait que ça retourne un hachage ici, mais j'ai essayé pas mal de choses et je n'ai pas compris comment je devais travailler avec mes associations dans Sinatra. Comment puis-je faire ceci?

Merci!

Répondre

0

La raison pour laquelle vos premiers travaux de bloc, mais la seconde ne est parce que dans le premier cas, vous utilisez une instance de modèle Sequel de classe Calendar, alors que dans le second cas, vous utilisez un Sequel dataset.

Lorsque vous itérez sur Calendar.each do |c|, la variable c est remplie avec une instance d'un objet modèle Sequel de classe Calendar. Cet objet a des méthodes relationnelles définies (one_to_many) et vous pouvez interroger schedules et y exécuter d'autres méthodes de modélisation. Cependant, c = DB[:calendar].first vous donne un Sequel dataset. Cet objet est différent d'une instance de modèle, il renvoie un hachage Ruby standard (ou un tableau de hachages).

Vous pouvez modifier votre 2ème bloc à utiliser un modèle à la place et il va obtenir le résultat souhaité:

get '/calendars' do 
    c = Calendar.first # <=== CHANGE FROM DATASET TO MODEL 
    c.schedules.to_json 
    content_type :json 
end