使用Rails将外部JSON保存到DB

时间:2013-01-17 08:16:26

标签: ruby-on-rails json api sqlite 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

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

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

class User < ActiveRecord::Base
   attr_accessor :id, :name
end

感谢任何帮助,谢谢!

2 个答案:

答案 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

这是做什么的:

  • 将JSON数据映射到一个块(user_data.map),该块接受每个JSON用户和
    1. 初始化新用户(User.new
    2. 为其分配id JSON数据(line['user']['id']
    3. 保存新用户(u.save)和
    4. 返回它(块中的最后一个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