首先,我建议您为 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 用户和
- 初始化一个新用户 (
User.new)
- 为其分配 id JSON 数据 (
line['user']['id'])
- 保存新用户 (
u.save),并且
- 返回它(
u块中的最后一个)。
- 然后,获取结果(分配给
users)并仅选择那些在 db ( users.select(&:persisted?)) 中实际存在(被持久化)的结果。例如,如果您有唯一性约束,external_id并且您尝试再次加载 db 数据,u.save将 return false,则不会(重新)创建记录,并且这些结果将从方法返回的结果中过滤掉。
这可能是也可能不是您想要的返回值。此外,您可能希望在name块中添加更多属性分配(来自 JSON 数据的 等)。我让你来填写其他细节。