将 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 允许你以你不能做的方式对它们执行查询一个字符串)
我有一个使用 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 允许你以你不能做的方式对它们执行查询一个字符串)