rake db: seed не работает для заполнения из API в приложении Ruby CLI - будет заполнять вручную записанные данные - Ruby / ActiveRecord - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь внести улучшения в школьный проект (супер-новичок), используя засеянные данные из API, чтобы создать приложение CLI с использованием Ruby и ActiveRecord, без Rails. Мне пришлось как бы «обмануть» данные, взяв их (ха sh идентификаторов объектов), добавив этот идентификатор в конец другой URL-ссылки (создав массив этих ссылок), а затем перебрав каждую и сделав запрос GET, поместив его в final ha sh, из которого я перебираю и засеваю свою базу данных.

Один раз мне удалось это сделать, но я хотел расширить набор данных, поэтому я очистил базу данных и пошел на повторное заполнение, и это больше не работает. Он немного зависает, затем вроде завершается, но данных нет. Единственное изменение, которое я внес в свой код, - это URL-адрес, но даже когда я возвращаю его обратно, он больше не работает. Однако он засевает все, что я написал вручную. URL-адрес отлично работает в моем браузере. Я попробовал rake: db: migrate: reset, но, похоже, у меня это не сработало.

Прошу прощения, если мой код немного запутан, я просто пытаюсь разобраться в этой проблеме, и это я впервые работаю с API / создаю такой проект. Я ценю любую помощь. Спасибо!

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

1 Ответ

0 голосов
/ 09 мая 2020

Как упоминалось в комментариях, в вашем коде был какой-то мошенник !. Вот более простая версия вашего последнего l oop.

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
...