Search code examples
rubyactiverecordrakeseed

rake db:seed not working to seed from API in Ruby CLI app - will seed manually written data - Ruby/ActiveRecord


I’m trying to make improvements to a project for school (super beginner) using seeded data from an API to make a CLI app using Ruby and ActiveRecord, no Rails. I have had to kind of "cheat" the data by taking it (a hash of object IDs), appending that ID to the end of another URL link (creating an array of these links) and then iterating over each one and making a GET request, putting it into final hash from which I iterate over and seed into my database.

I was able to successfully do it once - but I wanted to expand the data set, so I cleared the db and went to re-seed and it no longer works. It hangs for quite a bit, then seems to complete, but the data isnt there. The only change I made in my code was to the URL, but even when I change it back it no longer works. However, it does seed anything I've manually written. The URL works fine in my browser. I tried rake:db:migrate:reset but that didnt seem to work for me.

I apologize if my code is a bit messy, I'm just trying to get to the bottom of this issue and it is my first time working with APIs / creating a project like this. I appreciate any help. Thanks!

response = RestClient.get("https://collectionapi.metmuseum.org/public/collection/v1/search?departmentId=11&15&19&21&6q=*")

metData = JSON.parse(response)
url = "https://collectionapi.metmuseum.org/public/collection/v1/objects/"
urlArray = []
metData["objectIDs"].each do |e|
urlArray.push(url.to_s + e.to_s)
end
# urlArray.slice!(0,2)
urlArray
end

object_id_joiner

def finalHash
    finalHash =[]
    object_id_joiner.each do |e|
    response = RestClient.get(e)
    data = JSON.parse(response)
    finalHash.push(data)
    end
    finalHash

end

finalHash

 finalHash.each do |artist_hash|
    if artist_hash["artistDisplayName"] == nil
         next
    end

    if (!artist_hash["artistDisplayName"])
    art1 = Artist.create(artist_name:artist_hash["artistDisplayName"]) 
    else 
    next
    end 
    if (!artist_hash["objectID"])
    Artwork.create(title: artist_hash["title"],image: artist_hash["primaryImage"], department: artist_hash["department"], artist: art1, object_id: artist_hash["objectID"])
    else
        next
    end
end

Solution

  • As mentioned in comments you had some rogue ! in your code. Here is a simpler version of your last loop.

    finalHash.each do |artist_hash|
     next if artist_hash["artistDisplayName"] == nil
    
     # Now you don't need conditional for artistDisplayName
     art1 = Artist.create(artist_name: artist_hash["artistDisplayName"]) 
    
     # Now create artwork if you HAVE objectID
     if (artist_hash["objectID"])
        Artwork.create(title: artist_hash["title"],image: artist_hash["primaryImage"], department: artist_hash["department"], artist: art1, object_id: artist_hash["objectID"])
     end
    end