首页 > 解决方案 > 将 json 文件数据保存到 Rails 数据库

问题描述

我有一个使用 rails 5.2.1 的 Rails API,我正在开发一个使用 Mechanize Gem 提取 Web 数据的 Web Scraping API。

我要做的是,我会将所有这些网络抓取数据数据传递给 React.js,但首先我需要在我的数据库中获取这些数据,我很难弄清楚这一点。

因此,当我提取数据并在 JSON 文件(称为 data.json)中接收所有数据时,我惊呆了,直到这里哈哈。

{
  "Brazil":[
  {"Jungle Plants":[bla bla bla ]},
  {"Desert Plants":[ bla bla bla ]}],

  "Egypt":[
  {"Jungle Plants":[bla bla bla ]},
  {"Desert Plants":[ bla bla bla ]}]
  
  and so on...
}

所以接下来我需要做的是将我的 JSON 数据分离到我的数据库中,我已经有了这样的迁移设置:

class CreatePlants < ActiveRecord::Migration[5.2]
  def change
    create_table :plants do |t|
      t.string :country_name
      t.string :plant_categories

      t.timestamps
    end
  end
end

所以在表中我想要的是,我希望像“巴西”或“埃及”这样的国家名称或任何国家名称都进入country_name列,因此对于plant_categories

我的问题是,如何将我的data.json文件组织/分离到我的数据库中?我将非常感谢您的帮助!<3

标签: ruby-on-railsjsonrubypostgresqlrails-api

解决方案


这将是我的方法,我会使用 JSON 或 JSONB 列来保存每个数组,因为它们来自正文,所以我会将迁移更改为:

class CreatePlants < ActiveRecord::Migration[5.2]
  def change
    create_table :plants do |t|
      t.string :country_name
      t.jsonb :data

      t.timestamps
    end
  end
end

因此,假设您有解析的响应(在您应用JSON.parse到正文之后),产生以下哈希:

response =
  {
    "Brazil": [
      { "Jungle Plants": [ bla bla bla ] },
      { "Desert Plants": [ bla bla bla ] }
    ],
    "Egypt": [
      { "Jungle Plants": [ bla bla bla ] },
      { "Desert Plants": [ bla bla bla ] }
    ]

    and so on...
  }

我会做:

response.each { |key, value| Plant.create!(country_name: key, data: value) }

这样,如果您在上一条语句之后执行以下命令:

Plant.find_by(country_name: 'Brazil').data

你会得到你的数组:

[{ "Jungle Plants": [ bla bla bla ] }, { "Desert Plants": [ bla bla bla ] }]

但这是您的决定,您可以通过不同的方式完美解决这个“问题”,例如,您可以将数组保存为 anstring然后从数据库中检索它们并应用 aJSON.parse或在模型定义中应用serialize 方法来转换它们再array一次。另一种选择是进一步过滤响应并将它们保存在更多列中。

我会说最好的方法取决于你以后想要对数据做什么,但出于灵活性的原因,我的选择是我之前所说的,将数组从 API 保存到 JSONB 列,然后执行我想要的任何东西(另一个优点是将数据保存为 JSONB 允许您以无法仅使用字符串的方式对它们执行查询)


推荐阅读