使用Rails将外部JSON保存到DB
我正在使用gem“httparty”对外部源进行GET调用; 这是我的Controller.rb:
def show response = HTTParty.get('URI') user = JSON.parse(response) user.each {|line| puts line['user']['id']} #the "['user']['id']" is because of the nested JSON object that is returned after the parse. end
这会在我的rails控制台中返回正确的输出,但现在的问题是如何将[‘id’]保存到我的数据库中?
目前,我的用户模型有:id和:name; 来自外部API的JSON对象发送:id和:name以及一些我不需要的其他信息。
class User < ActiveRecord::Base attr_accessor :id, :name end
任何帮助表示赞赏,谢谢!
首先,我建议你为id创建另一个列(比如external_id
或者其他),而不是将它保存在User
模型的实际id
列中(该列在ActiveRecord中非常重要,你真的不想成为直接设置)。 您可以validation该列的唯一性,以确保不会将相同的用户数据导入到db中的多个单独记录中。
获得该列后,在User
模型中创建一个类方法(我称之为save_data_from_api
)将JSON数据加载到db中:
class User < ActiveRecord::Base # optional, but probably a good idea validates :external_id, :uniqueness => true def self.save_data_from_api response = HTTParty.get('URI') user_data = JSON.parse(response) users = user_data.map do |line| u = User.new u.external_id = line['user']['id'] # set name value however you want to do that u.save u end users.select(&:persisted?) end end
这是做什么的:
- 将JSON数据映射到一个块(
user_data.map
),该块接受每个JSON用户和- 初始化一个新用户(
User.new
) - 为它分配id JSON数据(
line['user']['id']
) - 保存新用户(
u.save
),和 - 返回它(块中的最后一个)。
- 初始化一个新用户(
- 然后,获取结果(分配给
users
)并仅选择db中实际存在(被持久化)的那些(users.select(&:persisted?)
)。 例如,如果您对external_id
有唯一性约束并且您尝试再次加载db数据,则u.save
将返回false
,不会(重新)创建记录,并且这些结果将从返回的结果中过滤掉从方法。
这可能是您想要的返回值,也可能不是。 此外,您可能希望在块中添加更多属性分配(来自JSON数据的name
等)。 我留给你填写其他细节。
在这里,我假设您已创建uri_id
字段以存储外部标识和name
字段,以将外部名称存储在用户表中。
您的控制器代码 –
def show response = HTTParty.get('URI') JSON.parse(response).each do |item| if (item.id != nil && item.name != nil) u = User.new(:uri_id => item.id, :name => item.name) u.save end end end
- 登录Web App服务器的用户的API身份validation
- Rails 3:在rails中使用JSON响应REST-ful操作的正确方法是什么?
- 使用active_model_serializers实现API版本控制的正确方法
- ENV变量中的Capistrano和API键?
- 使用Rails(HTTP请求)连接到Web服务?
- Swift TRON内容类型HeaderBuilder语法
- Youtube API V3插入评论问题
- Rails – OAuth ::问题exception:LinkedIn API中的parameter_absent
- 用于Rails的Mailchimp API – list.subscribe(:double_optin => false)无法正常工作