Ruby on rails 将json保存到模型和数据库

Ruby on rails 将json保存到模型和数据库,ruby-on-rails,ruby,json,rake,rake-task,Ruby On Rails,Ruby,Json,Rake,Rake Task,我正在尝试做一个定制的rake任务,它使用itunesapi按姓名搜索艺术家,如果它存在,它将把数据存储到数据库中 我需要两件事:1)检查艺术家是否存在(我如何检查响应),2)使用ActiveRecord创建它(如果存在) 我不知道如何实现它,下面是我的代码到目前为止的样子。 提前谢谢 require 'net/http' require 'json' task :artist,[""] do |t, args| request = ITunesSearchAPI.search(:

我正在尝试做一个定制的rake任务,它使用itunesapi按姓名搜索艺术家,如果它存在,它将把数据存储到数据库中

我需要两件事:1)检查艺术家是否存在(我如何检查响应),2)使用ActiveRecord创建它(如果存在)

我不知道如何实现它,下面是我的代码到目前为止的样子。 提前谢谢

require 'net/http'
require 'json'

  task :artist,[""] do |t, args|
    request = ITunesSearchAPI.search(:term => "#{args}")
    puts request
  end

首先,不要使用request这个词,它是一个保留字,可能会给您带来问题。您可以改为尝试
result

如果没有找到任何内容,您将返回一个空数组

所以你只需要检查一下

result.empty?
如果是基于艺术家的名字,那么搜索是非常直接的

unless Artist.exists?(name: result[0]["artistName"])
  Artist.create(name: result[0]["artistName", itunes_id: result[0]["artistId"])
end
因为苹果使用匹配算法,所以你的结果集总是可能返回多个条目,我会再次检查它是否是你首先想要的条目

1) 检查是否存在艺术家(如何检查响应)

这将取决于请求的内容,或者iTunes上没有艺术家时,
iTunesArchapi.search
方法的行为。通常,API返回JSON中的空数组。因此,您可以简单地检查结果数组是否为空

# Provided request['artists'] is an array
if request['artists'].empty?
    # no artists
else
    # there are artists
end
当我们使用它时,您不必插入
参数
,只要将它们打印出来,或者如果您想将其转换为
字符串
,就可以使用
.to_s
方法

ITunesSearchAPI.search(:term => args.to_s)

2) 如果存在,则使用ActiveRecord创建它

您可以在不使用Rails的情况下使用ActiveRecord。它一直是。它归结为安装active_记录gem,包括它,建立连接并从
ActiveRecord::Base
继承

require 'active_record'
require 'sqlite3'
require 'logger'

ActiveRecord::Base.logger = Logger.new('db.log')
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: 'db/mydb.sqlite3',
  timeout: 5000,
  pool: 5
)

class YourModel < ActiveRecord::Base
end
需要“活动记录”
需要'sqlite3'
需要“记录器”
ActiveRecord::Base.logger=logger.new('db.log')
ActiveRecord::Base.build\u连接(
适配器:“sqlite3”,
数据库:“db/mydb.sqlite3”,
超时:5000,
游泳池:5
)
类YourModel
响应是什么样的?艺术家模型中到底有什么?我猜你想用。这个宝石已经3年没有更新了,所以我认为它对你不起作用。非常感谢你的回复。很好地了解插值。@ R0UdER,考虑用投票回答作为“谢谢”这样的方式。非常感谢,当你看到正确答案时,看起来总是那么容易:
require 'active_record'
require 'sqlite3'
require 'logger'

ActiveRecord::Base.logger = Logger.new('db.log')
ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: 'db/mydb.sqlite3',
  timeout: 5000,
  pool: 5
)

class YourModel < ActiveRecord::Base
end