9

我正在使用 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

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

4

2 回答 2

16

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

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

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并且您尝试再次加载 db 数据,u.save将 return false,则不会(重新)创建记录,并且这些结果将从方法返回的结果中过滤掉。

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

于 2013-01-17T08:27:26.700 回答
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
于 2013-01-17T08:44:05.110 回答