在Ruby on Rails应用程序中将JSON从API端点保存到数据库

che*_*k78 2 ruby json ruby-on-rails

我是Ruby on Rails的新手,需要一些建议!我尝试在Kimono Labs建立一个webscraper并拥有一个JSON文件,您可以在其中将网站数据转换为API:

https://www.kimonolabs.com/api/3obhv4p0?apikey=WWHHbKEkOmAPXsObOccPBXTb5NgRyCNO我要保存到Ruby on Rails应用程序的数据库中.

具体来说,它是我想要保存到数据库的"结果"键.它包含Google财经与公司的数据,引用页面的URL,P/E和最新价格.其格式如下:

"results": {
    "collection1": [
      {
        "property1": {
          "href": "https://www.google.com/finance?catid=TRBC:57&sort=a&ei=Tx2WVonTG9uhe7Hpv_AN",
          "text": "Company"
        },
        "property2": "P/E (ttm)",
        "property3": "Quote",
        "index": 1,
        "url": "https://www.google.com/finance?catid=TRBC%3A57&sort=PE_RATIO&ei=6tyMVrqxIdaP0ASF0pbACQ"
      },
      {
        "property1": {
          "href": "https://www.google.com/finance?q=NASDAQ:NANO&ei=Tx2WVonTG9uhe7Hpv_AN",
          "text": "Nanometrics Incorporated"
        },
        "property2": "10,100.72",
        "property3": "14.04",
        "index": 2,
        "url": "https://www.google.com/finance?catid=TRBC%3A57&sort=PE_RATIO&ei=6tyMVrqxIdaP0ASF0pbACQ"
      },
Run Code Online (Sandbox Code Playgroud)

这是我的迁移:

ActiveRecord::Schema.define(version: 20160108073353) do

  create_table "stocks", force: :cascade do |t|
    t.string   "company"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string   "url"
    t.float    "pe"
    t.float    "quote"
  end
Run Code Online (Sandbox Code Playgroud)

问题是如何将此JSON文件加载到我的应用程序中?我认为它有以下步骤,因此我的问题可以分解为:

  • 我需要用RestClient或OpenURI打开/加载它>我该怎么做?
  • 解析数据并使其成为Ruby哈希>我该怎么做?
  • 然后遍历哈希并将数据保存到数据库?>我该怎么做?

谢谢您的帮助!

Inp*_*ego 7

是的,这些都是正确的步骤.

首先,你应该创建Stock模型:

$ rails g model stock --skip
Run Code Online (Sandbox Code Playgroud)

然后:

# get JSON
result = Net::HTTP.get(URI.parse('https://www.kimonolabs.com/api/3obhv4p0?apikey=WWHHbKEkOmAPXsObOccPBXTb5NgRyCNO'))

# parse JSON
json = JSON.parse(result)

# save data to DB
json['results']['collection1'][1..-1].each do |data| # [1..-1] ignores first dummy element
  Stock.create(
    company: data['property1']['text'],
    url: data['url'],
    pe: data['property2'].gsub(',', ''), # .gsub removes thousands separator
    quote: data['property3'].gsub(',', '')
  )
end
Run Code Online (Sandbox Code Playgroud)