rake db:seed не работает для заполнения из API в приложении Ruby CLI — будут заполняться вручную записанные данные — Ruby/ActiveRecord

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

Я смог успешно сделать это один раз, но я хотел расширить набор данных, поэтому я очистил базу данных и пошел на повторное заполнение, и это больше не работает. Он висит довольно долго, затем, кажется, завершается, но данных нет. Единственное изменение, которое я сделал в своем коде, касалось 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

person Buffy Summers    schedule 08.05.2020    source источник
comment
Есть ли дополнительный «!» В «if (!artist_hash[artistDisplayName]) art1 = Artist.create(artist_name:artist_hash[artistDisplayName]) else». Вы, вероятно, захотите создать запись, когда у вас есть имя исполнителя. И та же проблема, когда вы сохраняете Artwork. Я понимаю, что вы хотите сохранить его, когда у вас есть objectID. Но ваш скрипт делает это, когда у вас его нет   -  person Olkin    schedule 08.05.2020
comment
Большое спасибо, что поймали это. работал отлично. у меня, должно быть, была немного другая логика на моем первом семени, и я не осознавал, что это влияет.   -  person Buffy Summers    schedule 08.05.2020
comment
Если этот или любой другой ответ действительно решил вашу проблему, отметьте его как принятый.   -  person Abhishek Prusty    schedule 09.05.2020
comment
Я создал ответ из своего комментария, так что вы можете его принять @BuffySummers   -  person Olkin    schedule 09.05.2020
comment
Отлично, спасибо! Я принял это. Извините, это мой первый пост, и я не мог отметить его как ответ ранее. Я думал, это потому, что я был слишком новым.   -  person Buffy Summers    schedule 10.05.2020


Ответы (1)


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

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
person Olkin    schedule 09.05.2020