将 json 文件数据保存到 Rails 数据库

Save json file data in to Rails database

我有一个使用 rails 5.2.1 的 Rails API,我正在开发一个使用 Mechanize [=40] 提取 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

所以在 table 中,我想要的是,我希望 'Brazil' 或 'Egypt' 之类的国家/地区名称或任何国家/地区名称转到 country_name 列等 plant_categories.

我的问题是,如何将我的 organize/separate 我的 data.json 文件输入到我的数据库中?非常感谢您的帮助! <3

这将是我的方法,我会使用 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 ] }]

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

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