我正在使用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
感谢任何帮助,谢谢!
答案 0 :(得分:15)
首先,我建议您为ID创建另一个列(例如external_id
或其他内容),而不是将其保存在id
模型的实际User
列中( column在ActiveRecord中非常重要,你真的不想直接设置它。您可以验证该列的唯一性,以确保不会将相同的用户数据导入到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
这是做什么的:
user_data.map
),该块接受每个JSON用户和
User.new
)line['user']['id']
)u.save
)和u
。)users
)并仅选择db(users.select(&:persisted?)
)中实际存在(被持久化)的那些。例如,如果您在external_id
上有唯一性约束并且您尝试再次加载数据库数据,u.save
将返回false
,则不会(重新)创建记录,并且这些结果将从方法返回的结果中过滤掉。这可能是您想要的返回值,也可能不是。此外,您可能希望在块中添加更多属性分配({J}数据中的name
等)。我留给你填写其他细节。
答案 1 :(得分:0)
这里我假设您已创建uri_id
字段来存储外部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