ruby-on-rails - 将 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
解决方案
这将是我的方法,我会使用 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 允许您以无法仅使用字符串的方式对它们执行查询)
推荐阅读
- azure - 逻辑应用嵌套 forloop 错误工作流运行操作“响应”的类型为“响应”,无法嵌套在“foreach”类型的操作下
- sql - 从联接表中汇总特定列的数据(oracle 9i)
- javascript - 如果在 catch 语句中使用 else 语句,我可以有逻辑代码吗?
- python - 从 voice_engine.source 导入源 ModuleNotFoundError:没有名为“voice_engine”的模块
- vb.net - 如何使用互操作在 Word 文档的正文中添加书签
- spring-boot - 使用自定义身份验证令牌调用 setAuthentication 后,SecurityContextHolder 返回 null
- java - 检测文件中的行尾
- angular - 在填充组件变量之前调用 Reactive Forms 异步验证器
- java - Android SQLite:W / System.err:java.io.FileNotFoundException无法从资产复制数据库
- xcode - 预览时如何在 Mac Catalyst 中为依赖项指定 Mac OSX 部署目标