如何用json文件填充ruby on rails中的模型(数据库)?



我有一个json文件,里面有很多电影。我想创建一个模型'Movie',并从json文件中填充所有电影。我该怎么做?我知道我可以将json文件解析成哈希,但这不是我要找的东西。

您要查找的正确术语是"种子"!

但是,您将需要一个数据库,以及创建数据库和相关movies表的迁移。(有很多关于如何做到这一点的指南,以及官方文档)。

完成后,您需要"种子";你的数据库和json文件中的数据。

seeds.rb文件中,假设JSON文件是JSON形式的Movies数组,您应该能够循环每个MovieJSON对象并将其插入到您的数据库中。

为了增加docaholic的有用回复,这里有一些步骤/伪代码可能会有所帮助。

假设您正在使用SQL数据库,并且需要创建一个模型:

# creates a migration file. 
rails generate migration create_movies title:string #duration_in_minutes:integer or whatever fields you have
# edit the file to add other fields/ensure it has what you want.
rake db:migrate

编写一个脚本来填充您的数据库。有很多模式(rake task, test fixture等),你想使用哪一个取决于你需要什么(是否用于测试,生产环境,作为新环境的种子数据,等等)。

但是通常代码是这样的:

text_from_file = File.read(file_path)
JSON.parse(text_from_file).each do |json_movie_object|
Movie.create!(title: json_movie_object[:title], other_attribute: json_movie_object[:other_attribute])
# if the json attributes exactly match the column names, you can do
# Movie.create!(json_movie_object)
end

对于大量数据,这不是性能最好的选项。对于大文件,您可以使用insert_all以获得更高的效率,但这绕过了activerecord验证和回调,因此您需要了解这意味着什么。

对于我的例子,我需要在周围播种200个数据从JSON文件的生产,所以我试图从JSON文件插入数据在数据库中。

,首先,我在rails项目中创建了一个数据库

rails generate migration create_movies title:string duration_in_minutes:integer
# or whatever fields you have
# edit the file to add other fields/ensure it has what you want.
rake db:migrate

现在是时候播种数据了!假设您的movies.json文件有:

[
{"id":"1", "name":"Titanic", "time":"120"},
{"id":"2", "name":"Ruby tutorials", "time":"120"},,
{"id":"3", "name":"Something spetial", "time":"500"}
{"id":"4", "name":"2HAAS", "time":"320"}
]

现在,就像这4个数据,认为你的JSON文件有400多个数据要输入,这是一个噩梦,手动写入种子文件。你需要添加JSON宝石工作。运行

bundle add json

使用JSON文件。

db/seed.rb文件中,添加这些行来添加数据库中的400+信息:

infos_from_json = File.read(your/JSON/file/path/movies.json)
JSON.parse(infos_from_json).each do |t|
Movie.create!(title: t['name'], duration_in_minutes: 
t['time'])
end

:

  • infos_from_json变量从文件目录

    修复JSON文件
  • JSON.parse调用JSON数据,然后声明变量以指示文件所在的位置,each do循环划分每个数据,|t|将用于在每次调用中添加部分JSON.parse(infos_from_json).

  • Movie.create!(title: t['title'], duration_in_minutes: t['time'])正在向数据库中添加数据

这是我们如何轻松地从JSON文件中添加数据到数据库的方法。

有关在数据库中播种数据的更多信息,请查看文档

编辑:这个操作需要JSON gem输入bundle add json

最新更新