Ruby on Rails: Mencoba Mendapatkan data JSON dari API dan menyimpan ke database Postgres - rake dibatalkan! TypeError: tidak ada konversi implisit dari String menjadi Integer
Saya menggunakan Ruby on Rails dan mencoba mendapatkan data JSON dari API publik dan menyimpan ke database Postgres.
Ketika saya menjalankan rake db: seed, saya mendapatkan error berikut:
rake aborted!
TypeError: no implicit conversion of String into Integer
/db/seeds.rb:21:in `[]'
/db/seeds.rb:21:in `properties'
/db/seeds.rb:48:in `<top (required)>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
Sebagai referensi, baris 21 adalah:
json["data"].map do |property|
Baris 48 adalah tempat metode ini dipanggil:
properties
Inilah item pertama dalam larik JSON untuk memberi Anda gambaran tentang apa yang saya coba petakan.
[
{
"PublicationDate": "26/10/2018",
"PropertyNumber": 2195606,
"County": "LAOIS",
"LocalAuthority": "LAOIS COUNTY COUNCIL",
"Valuation": 70600.0,
"Category": "RETAIL (SHOPS)",
"Uses": "SUPERMARKET 2 [500-2500 SQ. M.], -",
"Address1": "36-42A/1 POUND STREET",
"Address2": "RATHDOWNEY",
"Address3": "CO. LAOIS",
"Address4": "",
"Address5": "",
"CarPark": 0,
"Xitm": 628016.65,
"Yitm": 678231.8,
"ValuationReport": [
{
"Level": "0 ",
"FloorUse": "SUPERMARKET",
"Area": 964.62,
"NavPerM2": 60.0000,
"Nav": 57877.200000
},
{
"Level": "0",
"FloorUse": "OFF LICENCE",
"Area": 1.00,
"NavPerM2": 8681.5800,
"Nav": 8681.580000
},
{
"Level": "0",
"FloorUse": "FIT-OUT ALLOWANCE",
"Area": 1.00,
"NavPerM2": 4051.4000,
"Nav": 4051.400000
}
]
},
Skema database saya mengikuti struktur JSON tetapi tidak persis (saya tidak yakin apakah ini menyebabkan masalah):
create_table "properties", force: :cascade do |t|
t.bigint "user_id"
t.string "publication_date"
t.string "property_number"
t.string "county"
t.string "local_authority"
t.string "valuation"
t.string "category"
t.string "uses"
t.string "address_1"
t.string "address_2"
t.string "address_3"
t.string "address_4"
t.string "address_5"
t.string "car_park"
t.string "xitm"
t.string "yitm"
t.string "valuation_report"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["user_id"], name: "index_properties_on_user_id"
end
Ini file seeds.rb saya:
require 'rest-client'
# Define Method
def properties
response = RestClient.get('https://api.valoff.ie/api/Property/GetProperties?Fields=*&LocalAuthority=LAOIS%20COUNTY%20COUNCIL&CategorySelected=RETAIL%20(SHOPS)&Format=csv&Download=false')
json = JSON.parse response
if !json.nil?
json["data"].map do |property|
Property.create(
publication_date: "#{PublicationDate}",
property_number: "#{PropertyNumber}",
county: "#{County}",
local_authority: "#{LocalAuthority}",
valuation: "#{Valuation}",
category: "#{Category}",
uses: "#{Uses}",
address_1: "#{Address1}",
address_2: "#{Address2}",
address_3: "#{Address3}",
address_4: "#{Address4}",
address_5: "#{Address5}",
car_park: "#{CarPark}",
xitm: "#{Xitm}",
yitm: "#{Yitm}",
valuation_report: "#{ValuationReport}"
)
end
else
puts "Error seeding properties."
end
end
# Call Method
properties
Ketika saya menjalankan rake db: seed, saya mendapatkan error berikut:
rake aborted!
TypeError: no implicit conversion of String into Integer
/db/seeds.rb:21:in `[]'
/db/seeds.rb:21:in `properties'
/db/seeds.rb:48:in `<top (required)>'
Tasks: TOP => db:seed
(See full trace by running task with --trace)
Sebagai referensi, baris 21 adalah:
json["data"].map do |property|
Baris 48 adalah tempat metode ini dipanggil:
properties
Bantuan apa pun akan dihargai, terima kasih
Jawaban
Untuk meringkas rekomendasi dalam berbagai komentar, jsonadalah Arraysetelah JSON diurai. Indeks array adalah bilangan bulat, sehingga json["data"]menghasilkan a TypeError. Kedua, tidak ada datakolom untuk data JSON yang dikembalikan. Anda dapat dengan mudah mengulang larik hasil dan membuat catatan Anda seperti ini:
def properties
response = RestClient.get('https://api.valoff.ie/api/Property/GetProperties?Fields=*&LocalAuthority=LAOIS%20COUNTY%20COUNCIL&CategorySelected=RETAIL%20(SHOPS)&Format=csv&Download=false')
json = JSON.parse(response)
json.each do |property|
puts "Creating property #{property['PropertyNumber']}"
Property.create!(
publication_date: property['PublicationDate'],
property_number: property['PropertyNumber'],
county: property['County'],
local_authority: property['LocalAuthority'],
valuation_report: property['ValuationReport']
# ... remaining fields omitted for brevity
)
end
end
Anda tidak perlu benar-benar .nil?memeriksa dokumen asli Anda, karena RestClientmenimbulkan kesalahan untuk kode respons HTTP apa pun selain 200-2007. Demikian juga, JSON.parseakan memunculkan kesalahan jika respons JSON tidak valid.
Hasil:
$ rails db:seed
Creating property 1555903
Creating property 1556133
Creating property 1556998
Creating property 1556516
Creating property 1557007
...