ruby-on-rails – 使用Rails将外部JSON保存到DB

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用Rails将外部JSON保存到DB前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用gem“httparty”对外部源进行GET调用;这是我的Controller.rb:
  1. def show
  2. response = HTTParty.get('URI')
  3. user = JSON.parse(response)
  4. user.each {|line| puts line['user']['id']}
  5. #the "['user']['id']" is because of the nested JSON object that is returned after the
  6. parse.
  7. end

这会在我的rails控制台中返回正确的输出,但现在的问题是如何将[‘id’]保存到我的数据库中?

目前,我的用户模型有:id和:name;来自外部API的JSON对象发送:id和:name以及一些我不需要的其他信息.

  1. class User < ActiveRecord::Base
  2. attr_accessor :id,:name
  3. end

任何帮助表示赞赏,谢谢!

解决方法

首先,我建议你为id创建另一个列(比如external_id或者其他),而不是将它保存在User模型的实际id列中(该列在ActiveRecord中非常重要,你真的不想成为直接设置).您可以验证该列的唯一性,以确保不会将相同的用户数据导入到db中的多个单独记录中.

获得该列后,在User模型中创建一个类方法(我称之为save_data_from_api)将JSON数据加载到db中:

  1. class User < ActiveRecord::Base
  2.  
  3. # optional,but probably a good idea
  4. validates :external_id,:uniqueness => true
  5.  
  6. def self.save_data_from_api
  7. response = HTTParty.get('URI')
  8. user_data = JSON.parse(response)
  9. users = user_data.map do |line|
  10. u = User.new
  11. u.external_id = line['user']['id']
  12. # set name value however you want to do that
  13. u.save
  14. u
  15. end
  16. users.select(&:persisted?)
  17. end
  18.  
  19. end

这是做什么的:

>将JSON数据映射到一个块(user_data.map),该块接受每个JSON用户

>初始化新用户(User.new)
>为其分配id JSON数据(line [‘user’] [‘id’])
>保存新用户(u.save),和
>返回它(块中的最后一个).

>然后,获取结果(分配给用户)并仅选择db中实际存在(被持久化)的那些(users.select(&:persisted?)).例如,如果您对external_id有唯一性约束并且您尝试再次加载db数据,则u.save将返回false,不会(重新)创建记录,并且这些结果将从返回的结果中过滤掉从方法.

这可能是您想要的返回值,也可能不是.此外,您可能希望在块中添加更多属性分配(来自JSON数据的名称等).我留给你填写其他细节.

猜你在找的Ruby相关文章