Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在RubyonRails应用程序中将JSON从API端点保存到数据库_Ruby On Rails_Ruby_Json - Fatal编程技术网

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

Ruby on rails 在RubyonRails应用程序中将JSON从API端点保存到数据库,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,我是RubyonRails新手,需要一些建议!我正在尝试构建一个webscraper,并在和服实验室中拥有一个JSON文件,您可以在这里将网站数据转换为API: 我想保存到Ruby on Rails应用程序的数据库中 特别是我想保存到数据库的“results”键。它包含来自谷歌金融公司的数据、报价页面的URL、市盈率和最新价格。其格式如下: "results": { "collection1": [ { "property1": { "hr

我是RubyonRails新手,需要一些建议!我正在尝试构建一个webscraper,并在和服实验室中拥有一个JSON文件,您可以在这里将网站数据转换为API:

我想保存到Ruby on Rails应用程序的数据库中

特别是我想保存到数据库的“results”键。它包含来自谷歌金融公司的数据、报价页面的URL、市盈率和最新价格。其格式如下:

"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"
      },
这是我的迁移:

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
问题是如何将这个JSON文件加载到我的应用程序中?我认为它有以下步骤,因此我的问题可以分为:

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

谢谢你的帮助

是的,这些是正确的步骤

首先,您应该创建
股票
模型:

$ rails g model stock --skip
然后:

# 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

谢谢你,真管用!实际上,我希望定期根据JSON数据更新此表。该表是股票筛选程序的结果,因此股票列表将更改(公司名称、报价、P/E;但不是属于公司名称的URL)。我想每次运行一个Stock.delete_,然后使用上面的代码加载一个新表。这是路吗?或者检查“公司”列,查看新数据是否有重复项,如果公司还不存在,则更新P/E+报价并添加新行。我应该用if语句来实现这一点吗?谢谢你的建议!第一种方法更简单,很可能会表现更好,因此我建议选择它。我还建议使用
Stock.connection.execute(“TRUNCATE TABLE#{Stock.TABLE_name}”)
而不是
Stock.delete_all
以提高性能,以防您不使用此表的外部键。请参阅