asi*_*ing 9 sqlite api json ruby-on-rails migrate
我正在使用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
Run Code Online (Sandbox Code Playgroud)
这会在我的rails控制台中返回正确的输出,但现在的问题是如何将['id']保存到我的数据库中?
目前,我的用户模型有:id和:name; 来自外部API的JSON对象发送:id和:name以及我不需要的一堆其他信息.
class User < ActiveRecord::Base
attr_accessor :id, :name
end
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏,谢谢!
Chr*_*erg 17
首先,我建议你为id创建另一个列(比如说external_id或者什么),而不是将它保存在模型的实际id列中User(该列在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
Run Code Online (Sandbox Code Playgroud)
这是做什么的:
user_data.map),它接受每个JSON用户和
User.new)line['user']['id'])u.save)和u块中的最后一个).users)并仅选择db(users.select(&:persisted?))中实际存在(被持久化)的那些.例如,如果您有唯一性约束,external_id并且尝试再次加载db数据,u.save将返回false,则不会(重新)创建记录,并且将从该方法返回的结果中过滤掉这些结果.这可能是您想要的返回值,也可能不是.此外,您可能希望在块中添加更多属性分配(name等等来自JSON数据).我留给你填写其他细节.
| 归档时间: |
|
| 查看次数: |
11728 次 |
| 最近记录: |